ADO.NET学习笔记-非链接类
生活随笔
收集整理的這篇文章主要介紹了
ADO.NET学习笔记-非链接类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. DataTable類 DataTable類即是存在于內存中的表格式數(shù)據(jù),包括行、列及約束,其中行主要用于存儲數(shù)據(jù),而列和約束共同組成DataTable的Schema(架構)。 2.?創(chuàng)建主鍵組合列 主鍵可以一列構成,也可由多列構成,統(tǒng)一起見,ADO.NET在創(chuàng)建主鍵時,都使用列數(shù)組,例: cars.PrimaryKey = new DataColumn[] { vin?}; 3. 使用自增長列做為主鍵 在應用程序中設置自增長列的方法如下: 1)?將列的AutoIncrement屬性設為true? 2) 將列的AutoIncrementSeed設為-1 3) 將列的AutoIncrementStep設為-1 第二、第三步設為-1的原因為,在多個客戶端同時生成數(shù)據(jù)傳回數(shù)據(jù)庫時,極可能出現(xiàn)數(shù)據(jù)沖突,拋出異常,如將Seed和Step設為-1,則應用程序生成的編號永遠為負數(shù),避免了與數(shù)據(jù)庫編號相沖突。 4. 向DataTable添加數(shù)據(jù)(DataRow)的方法 DataTable擁有一個Rows屬性,返回一個DataRowCollection對象。向DataTable添加數(shù)據(jù),即是向DataRowCollection中添加DataRow。添加的方法大致有三種: 1) DataRow newCar = cars.NewRow(); newCar["Vin"] = "123456789ABCD" cars.Rows.Add(newCar); 2) cars.Rows.Add("123456789ABCD"); 3) cars.LoadDataRow(new object[] {"123456789ABCD"}, LoadOption.OverwriteChanges); 其中第三種方法,使用DataTable.LoadDataRow()方法,是“查找并更新行”的意思,如果沒有查找到相關行,則創(chuàng)建這個行。 5. 數(shù)據(jù)行版本(DataRowVersion)的4個枚舉類型值 為了向數(shù)據(jù)使用者提供數(shù)據(jù)行在不同狀態(tài)下的值,數(shù)據(jù)行(Data Row)擁有3種基本版本狀態(tài),即Original,Current和Proposed,當然還有第4種,Default。當數(shù)據(jù)行剛被載入時,它只有一個版本狀態(tài),即Current(并非Original,Original即意味著有改更發(fā)生),此時的Default為Current;當執(zhí)行了BeginEdit方法后,數(shù)據(jù)行進入更改模式,更改后的數(shù)據(jù)作為一個新的實例存在,其版本狀態(tài)稱作Proposed,此時的Default為Proposed;執(zhí)行了EndEdit方法后,Proposed變?yōu)镃urrent,而原先的Current變?yōu)镺riginal,Proposed就不存在了,此時的Default為Current。再次調用BeginEdit方法后,Current變?yōu)镻roposed,Default為Proposed; 再調用EndEdit方法,Proposed變?yōu)镃urrent,Proposed不存在了,但要注意,Original這次沒有變化,還是當初載入的那一個,此時的Default為Current。即Original保留上一次載入或是最近一次AcceptChanges方法調用后的那個值。 另需注意,DataRow的DataRowVersion屬性值(通過HasVersion(Version)方法獲得)與其DataRowState屬性值相關聯(lián),如Original只在DataRow的狀態(tài)變?yōu)镸odified, Unchanged或Deleted時有意義,而在Added狀態(tài)下,會拋出異常(DataRow.HasVersion(Original))。 6. AcceptChanges和RejectChanges方法 這兩個方法同時存在于(可用于)DataSet, DataTable和DataRow對象,明顯的,在DataSet上執(zhí)行方法時,其包含的所有DataTable和DataRow均會受到影響,反之,如果只在某個特定的DataRow上執(zhí)行此方法,則其父輩的DataTable和DataSet不受任何影響。 一般情況下,載入數(shù)據(jù)后,DataRow的狀態(tài)(State)為Added,此時調用AcceptChanges或RejectChanges方法,則DataRow的狀態(tài)變?yōu)閁nchanged,再改變一下DataRow的值,其狀態(tài)又變?yōu)镃hanged。調用一下AcceptChanges,則產生一個Original版本,當然如果調用RejectChanges,則不會產生Original版本,只有一個Current版本。 在完成數(shù)據(jù)編輯后,可以調用DataTable的GetChanges方法,返回一個DataTable,其中的內容僅為自上次AcceptChanges方法調用后變動過的DataRow行,這樣回傳至遠程數(shù)據(jù)庫時,數(shù)據(jù)量就要小得多。 需注意: 1) 當數(shù)據(jù)與數(shù)據(jù)庫成功同步后,一定要調用AcceptChanges方法將DataRow的值統(tǒng)一設置為Unchanged,以與遠程數(shù)據(jù)庫同步。 2) 當調用RejectChanges時,Original里的值要拷貝至Current,以還原Load時的初始狀態(tài)或是上一次調用AcceptChanges后的狀態(tài)。 7. 使用SetAdded或SetModified將行狀態(tài)強行設置為Added或Modified 在某些情況下,需要將行(DataRow)的狀態(tài)改為Added或Modified以便DataAdapter有效識別并上傳至遠程服務器。需要注意的是,這兩個方法均只能使用在DataRow對象上,且需保證DataRow的狀態(tài)為UnChanged,否則會出錯。使用SetAdded方法時,會丟棄DataRow的Original狀態(tài)值,因為一個具有Added狀態(tài)的行,是不可能有Orginal狀態(tài)值的。 8. 刪除和恢復 使用行(DataRow)的Delete方法可將需刪除的行標注出來(但并未真正刪除),些時此行的Current和Proposed狀態(tài)值被丟棄,如果此時調用調用RejectChanges方法,則Original狀態(tài)值被拷貝至Current,其狀態(tài)變?yōu)閁nchanged,但自load或AcceptChanges調用以來的所有更改均舍棄,若調用AcceptChanges方法,行被真正刪除,再引用此行會拋出異常。 9. DataTable的復制和克隆方法 復制和克隆在中英文中并沒有什么區(qū)別,但作為DataTable的兩個方法,二者區(qū)別明顯。Copy方法用于復制表格的結構和數(shù)據(jù),而Clone方法僅復制表格的結構,而不復制數(shù)據(jù)。 10. 行版本和行狀態(tài)的區(qū)別 DataRow有版本(Data Version)和狀態(tài)(Data State)的區(qū)別,其中版本有4個,即Original, Current, Proposed, Default;而狀態(tài)有5個,即Detached, Added, Deleted, Unchanged, Modified。版本和狀態(tài)是同時存在的,但其任意組合并不是一定存在。如行被Deleted以后,其Current和Proposed數(shù)據(jù)均被丟棄,只剩下Original供還原時使用。 11. DataViewRowState枚舉對象 這個枚舉對象聽名字好像只與狀態(tài)相關,其實是版本與狀態(tài)的結合,其包含有8個狀態(tài): Added, CurrentRows(相當于Added|Unchanged|ModifiedCurrent), Deleted, ModifiedCurrent, ModifiedOriginal, None, OriginalRows和Unchanged 12. DataView的輸出問題 先看代碼: static void PrintView(DataView dv) { StringBuilder buffer = new StringBuilder(); foreach (DataColumn dc in?dv.Table.Columns) buffer.AppendFormat("{0, 15}", dc.ColumnName); foreach (DataRowView dr in dv) { buffer.Append("\n"); foreach (DataColumn dc in dv.Table.Columns) buffer.AppendFormat("{0, 15}",?dr.Row[dc]); } Console.WriteLine(buffer.ToString()); } 紅色標注部分為重點??梢钥闯?#xff0c;對列的讀取,可取視圖的表格屬性,再取其列;但對于行,如果也用其表格屬性再取其行,則其所做的篩選信息將全部丟失,所以只能使用DataRowView對象(可以看出,其實DataView就是DataRowView的集合)。 當然,我們也可以將DataView轉換為DataTable,然后再用我們熟悉的方法輸出,但轉換產生的開銷比較大,用多了自然會影響效率。 13. DataSet對象 DataSet可看成是內存中的數(shù)據(jù)庫,但其本身與數(shù)據(jù)庫的差別還是很大的,這是后話。DataSet包含一組DataTable對象和一組DataRalation對象,DataTable對象本身可包含唯一鍵及外鍵,用以保證數(shù)據(jù)完整性。 我們可以使用手工編程的方法創(chuàng)建DataSet對象,也可以使用XSD(XML schema Definition)文件創(chuàng)建強類型的DataSet對象,后者更簡單,更常用。 14. DataRelation對象 DataRelation對象用以將DataSet對象內的多個DataTable對象關聯(lián)起來,其作用相當于數(shù)據(jù)庫中的表間關系。在創(chuàng)建DataRelation對象時,我們可以指定主鍵及外鍵約束,如在下面的語句中: ds.Relations.Add("vendor_parts", vendors.Columns[0], parts.Columns[2]); ds.Relations.Add("vendor_parts", vendors.Columns[0], parts.Columns[2], true); 兩條語句的作用一樣,只是第二條語句指定了createConstraints這個布爾值,即是否在父表中創(chuàng)建主鍵約束,在子表中創(chuàng)建外鍵約束,默認為true,這也符合我們一般的需求。 另一個有用的默認值為創(chuàng)建級聯(lián)完整性約束(Cascade),默認為Rule.Cascade。 15. 合成DataSet數(shù)據(jù) DataSet數(shù)據(jù)合成在程序中非常常見。 16. Path類 Path類存在于System.IO命名空間,用于處理文件及文件夾路徑操作,擁有跨平臺的特點和好處,其常用方法為:Path.Combine(Param string[] paths),用作將多個paths聯(lián)成一個整體的Path。 17. 序列化 (Serialization)和逆序列化(Deserialization) 序列化即是將DataSet中的數(shù)據(jù)保存為xml或是bin(流)文件存放在本地,而逆序列化正好相反,從本地的xml或是bin(流)文件中讀入構架和(或)數(shù)據(jù),生成DataSet。以xml文件為例,序列化使用DataSet.WriteXml()方法,逆序列化使用DataSet.ReadXml()方法。 18. 序列化為xml文件 上面已經提到過,序列化為xml文件時,使用DataSet的WriteXml()方法,此方法需2個參數(shù),一個是要保存的文件名,要全路徑名,另一個是序列化類型尾數(shù),是一個枚舉值,有3個,分別為WriteSchema(架構+數(shù)據(jù)),IgnoreSchema(僅數(shù)據(jù))和DiffGram(含Original和Current值)。要修改xml文件中的顯示方式和內容,可做相應個性,如要改變表格名稱,可修改DataTable的TableName屬性;要修改各列在xml中的顯示方式,可修改各列的ColumnMapping屬性(ColumnMapping屬性僅對生成的XML文件起作用)。其中ColumnMapping的值有4個,分別為Attribute,?Element, Hidden, SimpleContent。其中Attribute和Element與Xml語法相關。 19. 將更改過的DataSet保存(序列化)為xml文件(使用XmlWriteMode.DiffGram) 格式如下: cars.WriteXml(desktopFileName("cars.xml"),?XmlWriteMode.DiffGram); 這里的DiffGram保存了所有的DataRowVersion信息。利用此格式的XML文檔保存和恢復DataSet將不會有信息丟失。 20. 從文件創(chuàng)建DataSet(Deserialize,逆序列化) 需要特別注意的是,如果沒有提供架構信息,則所有的數(shù)據(jù)都會被當成是字符數(shù)據(jù),所以在從XML讀取數(shù)據(jù)前,一定要先載入架構信息。 示例代碼如下: DataSet ds = new DataSet(); ds.ReadXmlSchema(desktopFileName("cars.xsd")); ds.ReadXml(desktopFileName("cars.xml"),?XmlReadMode.IgnoreSchema); 其中的XmlReadMode枚舉值有:Auto(自動選擇合適的值),DiffGram(見19點),Fragment(作為片段讀取),IgnorSchema(不讀取架構信息),InferSchema(自動推斷架構信息),InferTypedSchema(自動推斷,但新加項不再為string),ReadSchema(加載xml文檔中的架構信息,如果沒有架構信息,則拋出異常) 21. 使用DataTableReader類循環(huán)讀取數(shù)據(jù) DataTableReader類用于迭代一個或多個數(shù)據(jù)表(DataTable)中的數(shù)據(jù)行(DataRow),返回的行數(shù)據(jù)只讀、只進(Read Only & Forward Only),換言之,在迭代過程中,你可以往DataTable中添加或刪除數(shù)據(jù),如果修改的數(shù)據(jù)在指針(Position Cursor)以前,則修改的數(shù)據(jù)就不管了,但如果修改的數(shù)據(jù)在指針以后,則修改的數(shù)據(jù)要反映出來。當指針到達行末尾時,Read方法返回Null。語法如下: DataTableReader rd =?cars.CreateDataReader(); while(rd.Read()) { do something; } rd.NextResult(); while(rd.Read()) { do something; }
?
轉載于:https://www.cnblogs.com/lqs2011/p/4238571.html
總結
以上是生活随笔為你收集整理的ADO.NET学习笔记-非链接类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [linux内核][LINUX内核编程]
- 下一篇: MVC增加操作日志