ADO.NET学习笔记-非链接类
生活随笔
收集整理的這篇文章主要介紹了
ADO.NET学习笔记-非链接类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. DataTable類 DataTable類即是存在于內存中的表格式數據,包括行、列及約束,其中行主要用于存儲數據,而列和約束共同組成DataTable的Schema(架構)。 2.?創建主鍵組合列 主鍵可以一列構成,也可由多列構成,統一起見,ADO.NET在創建主鍵時,都使用列數組,例: cars.PrimaryKey = new DataColumn[] { vin?}; 3. 使用自增長列做為主鍵 在應用程序中設置自增長列的方法如下: 1)?將列的AutoIncrement屬性設為true? 2) 將列的AutoIncrementSeed設為-1 3) 將列的AutoIncrementStep設為-1 第二、第三步設為-1的原因為,在多個客戶端同時生成數據傳回數據庫時,極可能出現數據沖突,拋出異常,如將Seed和Step設為-1,則應用程序生成的編號永遠為負數,避免了與數據庫編號相沖突。 4. 向DataTable添加數據(DataRow)的方法 DataTable擁有一個Rows屬性,返回一個DataRowCollection對象。向DataTable添加數據,即是向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()方法,是“查找并更新行”的意思,如果沒有查找到相關行,則創建這個行。 5. 數據行版本(DataRowVersion)的4個枚舉類型值 為了向數據使用者提供數據行在不同狀態下的值,數據行(Data Row)擁有3種基本版本狀態,即Original,Current和Proposed,當然還有第4種,Default。當數據行剛被載入時,它只有一個版本狀態,即Current(并非Original,Original即意味著有改更發生),此時的Default為Current;當執行了BeginEdit方法后,數據行進入更改模式,更改后的數據作為一個新的實例存在,其版本狀態稱作Proposed,此時的Default為Proposed;執行了EndEdit方法后,Proposed變為Current,而原先的Current變為Original,Proposed就不存在了,此時的Default為Current。再次調用BeginEdit方法后,Current變為Proposed,Default為Proposed; 再調用EndEdit方法,Proposed變為Current,Proposed不存在了,但要注意,Original這次沒有變化,還是當初載入的那一個,此時的Default為Current。即Original保留上一次載入或是最近一次AcceptChanges方法調用后的那個值。 另需注意,DataRow的DataRowVersion屬性值(通過HasVersion(Version)方法獲得)與其DataRowState屬性值相關聯,如Original只在DataRow的狀態變為Modified, Unchanged或Deleted時有意義,而在Added狀態下,會拋出異常(DataRow.HasVersion(Original))。 6. AcceptChanges和RejectChanges方法 這兩個方法同時存在于(可用于)DataSet, DataTable和DataRow對象,明顯的,在DataSet上執行方法時,其包含的所有DataTable和DataRow均會受到影響,反之,如果只在某個特定的DataRow上執行此方法,則其父輩的DataTable和DataSet不受任何影響。 一般情況下,載入數據后,DataRow的狀態(State)為Added,此時調用AcceptChanges或RejectChanges方法,則DataRow的狀態變為Unchanged,再改變一下DataRow的值,其狀態又變為Changed。調用一下AcceptChanges,則產生一個Original版本,當然如果調用RejectChanges,則不會產生Original版本,只有一個Current版本。 在完成數據編輯后,可以調用DataTable的GetChanges方法,返回一個DataTable,其中的內容僅為自上次AcceptChanges方法調用后變動過的DataRow行,這樣回傳至遠程數據庫時,數據量就要小得多。 需注意: 1) 當數據與數據庫成功同步后,一定要調用AcceptChanges方法將DataRow的值統一設置為Unchanged,以與遠程數據庫同步。 2) 當調用RejectChanges時,Original里的值要拷貝至Current,以還原Load時的初始狀態或是上一次調用AcceptChanges后的狀態。 7. 使用SetAdded或SetModified將行狀態強行設置為Added或Modified 在某些情況下,需要將行(DataRow)的狀態改為Added或Modified以便DataAdapter有效識別并上傳至遠程服務器。需要注意的是,這兩個方法均只能使用在DataRow對象上,且需保證DataRow的狀態為UnChanged,否則會出錯。使用SetAdded方法時,會丟棄DataRow的Original狀態值,因為一個具有Added狀態的行,是不可能有Orginal狀態值的。 8. 刪除和恢復 使用行(DataRow)的Delete方法可將需刪除的行標注出來(但并未真正刪除),些時此行的Current和Proposed狀態值被丟棄,如果此時調用調用RejectChanges方法,則Original狀態值被拷貝至Current,其狀態變為Unchanged,但自load或AcceptChanges調用以來的所有更改均舍棄,若調用AcceptChanges方法,行被真正刪除,再引用此行會拋出異常。 9. DataTable的復制和克隆方法 復制和克隆在中英文中并沒有什么區別,但作為DataTable的兩個方法,二者區別明顯。Copy方法用于復制表格的結構和數據,而Clone方法僅復制表格的結構,而不復制數據。 10. 行版本和行狀態的區別 DataRow有版本(Data Version)和狀態(Data State)的區別,其中版本有4個,即Original, Current, Proposed, Default;而狀態有5個,即Detached, Added, Deleted, Unchanged, Modified。版本和狀態是同時存在的,但其任意組合并不是一定存在。如行被Deleted以后,其Current和Proposed數據均被丟棄,只剩下Original供還原時使用。 11. DataViewRowState枚舉對象 這個枚舉對象聽名字好像只與狀態相關,其實是版本與狀態的結合,其包含有8個狀態: 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()); } 紅色標注部分為重點。可以看出,對列的讀取,可取視圖的表格屬性,再取其列;但對于行,如果也用其表格屬性再取其行,則其所做的篩選信息將全部丟失,所以只能使用DataRowView對象(可以看出,其實DataView就是DataRowView的集合)。 當然,我們也可以將DataView轉換為DataTable,然后再用我們熟悉的方法輸出,但轉換產生的開銷比較大,用多了自然會影響效率。 13. DataSet對象 DataSet可看成是內存中的數據庫,但其本身與數據庫的差別還是很大的,這是后話。DataSet包含一組DataTable對象和一組DataRalation對象,DataTable對象本身可包含唯一鍵及外鍵,用以保證數據完整性。 我們可以使用手工編程的方法創建DataSet對象,也可以使用XSD(XML schema Definition)文件創建強類型的DataSet對象,后者更簡單,更常用。 14. DataRelation對象 DataRelation對象用以將DataSet對象內的多個DataTable對象關聯起來,其作用相當于數據庫中的表間關系。在創建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這個布爾值,即是否在父表中創建主鍵約束,在子表中創建外鍵約束,默認為true,這也符合我們一般的需求。 另一個有用的默認值為創建級聯完整性約束(Cascade),默認為Rule.Cascade。 15. 合成DataSet數據 DataSet數據合成在程序中非常常見。 16. Path類 Path類存在于System.IO命名空間,用于處理文件及文件夾路徑操作,擁有跨平臺的特點和好處,其常用方法為:Path.Combine(Param string[] paths),用作將多個paths聯成一個整體的Path。 17. 序列化 (Serialization)和逆序列化(Deserialization) 序列化即是將DataSet中的數據保存為xml或是bin(流)文件存放在本地,而逆序列化正好相反,從本地的xml或是bin(流)文件中讀入構架和(或)數據,生成DataSet。以xml文件為例,序列化使用DataSet.WriteXml()方法,逆序列化使用DataSet.ReadXml()方法。 18. 序列化為xml文件 上面已經提到過,序列化為xml文件時,使用DataSet的WriteXml()方法,此方法需2個參數,一個是要保存的文件名,要全路徑名,另一個是序列化類型尾數,是一個枚舉值,有3個,分別為WriteSchema(架構+數據),IgnoreSchema(僅數據)和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. 從文件創建DataSet(Deserialize,逆序列化) 需要特別注意的是,如果沒有提供架構信息,則所有的數據都會被當成是字符數據,所以在從XML讀取數據前,一定要先載入架構信息。 示例代碼如下: 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類循環讀取數據 DataTableReader類用于迭代一個或多個數據表(DataTable)中的數據行(DataRow),返回的行數據只讀、只進(Read Only & Forward Only),換言之,在迭代過程中,你可以往DataTable中添加或刪除數據,如果修改的數據在指針(Position Cursor)以前,則修改的數據就不管了,但如果修改的數據在指針以后,則修改的數據要反映出來。當指針到達行末尾時,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增加操作日志