初學.NET必須搞懂ADO.NET,而DATASET是資料操作當中必須掌握的一個環節:
ADO.NET是.Net FrameWork SDK中用以操作資料庫的類庫的總稱。而DataSet類則是ADO.NET中最核心的成員之一,也是各種開發基於.Net平台程式語言開發資料庫應用程式最常接觸的類。之所以DataSet類在ADO.NET中具有特殊的地位,是因為DataSet在ADO.NET實現從資料庫抽取資料中起到關鍵作用,在從資料庫完成資料幫浦後,DataSet就是資料的存放地,它是各種資料來源中的資料在電腦記憶體中映射成的緩衝,所以有時說DataSet可以看成是一個資料容器。同時它在用戶端實現讀取、更新資料庫等過程中起到了中間組件的作用(DataReader只能檢索資料庫中的資料)。
各種.Net平台開發語言開發資料庫應用程式,一般並不直接對資料庫操作(直接在程式中調用預存程序等除外),而是先完成資料連線和通過資料配接器填充DataSet對象,然後用戶端再通過讀取DataSet來獲得需要的資料,同樣更新資料庫中資料,也是首先更新DataSet,然後再通過DataSet來更新資料庫中對應的資料的。可見瞭解、掌握ADO.NET,首先必須瞭解、掌握DataSet。DataSet主要有三個特性:
1. 獨立性。DataSet獨立於各種資料來源。微軟公司在推出DataSet時就考慮到各種資料來源的多樣性、複雜性。在.Net中,無論什麼類型資料來源,它都會提供一致的關係編程模型,而這就是DataSet。
2. 離線(斷開)和串連。DataSet既可以以離線方式,也可以以即時串連來操作資料庫中的資料。這一點有點像ADO中的RecordSet。
3. DataSet對象是一個可以用XML形式表示的資料檢視,是一種資料關係視圖。
一.DataSet對象的結構模型及和RecordSet的比較
雖說ADO.NET是 ADO在.Net平台下得後繼版本,但二者的區別是很大的。突出表現在ADO中的RecordSet對象和ADO.NET中的DataSet對象。RecordSet其實也是非常靈活的一個對象,微軟公司推出它也是煞費苦心,如:RecordSet可以離線操作資料庫,效能優良,效率較高等等這些都讓當時的程式員為之一振。RecordSet雖然已經很複雜,但DataSet卻比RecordSet複雜的多,我們知道每一DataSet往往是一個或多個DataTable 對象的集合,這些對象由資料行和資料列以及主鍵、外鍵、約束和有關DataTable對象中資料的關係資訊組成。而RecordSet只能存放單張資料表,雖然這張資料表可以由幾張資料表JOIN產生。所以有些時候說,RecordSet更類似於DataSet中的DataTable。
DataSet對象結構還是非常複雜的,在DataSet對象的下一層中是DataTableCollection對象、DataRelationCollection對象和ExtendedProperties對象。上文已經說過,每一個DataSet對象是由若干個DataTable對象組成。DataTableCollection就是管理DataSet中的所有DataTable對象。表示DataSet中兩個DataTable對象之間的父/子關係是DataRelation對象。它使一個DataTable 中的行與另一個DataTable中的行相關聯。這種關聯類別似於關聯式資料庫中資料表之間的主鍵列和外鍵列之間的關聯。DataRelationCollection對象就是管理DataSet中所有DataTable之間的DataRelation關係的。在DataSet中DataSet、DataTable和DataColumn都具有ExtendedProperties屬性。ExtendedProperties其實是一個屬性集(PropertyCollection),用以存放各種自訂資料,如產生資料集的SELECT語句等。
二.使用DataSet:
DataSet其實就是資料集,上文已經說過DataSet是把資料庫中的資料對應到記憶體緩衝中的所構成的資料容器,對於任何資料來源,它都提供一致的關係編程模型。在DataSet中既定義了資料表的約束關係以及資料表之間的關係,還可以對資料表中的資料進行排序等。DataSet使用方法一般有三種:
1. 把資料庫中的資料通過DataAdapter對象填充DataSet。
2. 通過DataAdapter對象操作DataSet實現更新資料庫。
3. 把XML資料流或文本載入到DataSet。
下面就來詳細探討以上DataSet使用方法的具體實現,使用語言是C#。
1. 把資料庫中的資料通過DataAdapter對象填充DataSet:
掌握DataSet使用方法必須掌握ADO.NET另外一個核心常用成員--資料提供者(Data Provider)。資料提供者(也稱為託管提供者Managed Provider)是一個類集合,在.Net FrameWork SDK 1.0中資料提供者分為二種:The SQL Server .NET Data Provider和The OLE DB .NET Data Provider。而到了.Net FrameWork SDK 1.1時,ADO.NET中又增加了The ODBC .NET Data Provider和 The Oracle .NET Data Provider二個資料提供者。The SQL Server .NET Data Provider的操作資料庫對象只限於Sql Server 7.0及以上版本,Oracle .NET Data Provider的操作資料庫對象只限於Oracle 8.1.7及以上版本。而The OLE DB .NET Data Provider和The ODBC .NET Data Provider可操作的資料庫類型就相對多了許多,只要它們在本地分別提供Ole Db提供者和ODBC提供者。
在這些資料提供者中都有一個DataAdapter類,如:OLE DB .NET Framework 資料提供者中是 OleDbDataAdapter類,The SQL Server .NET Framework 資料提供者中是SqlDataAdapter類,The ODBC .NET Framework 資料提供者中是OdbcDataAdapter類。通過這些DataAdapter就能夠實現從資料庫中檢索資料並填充 DataSet 中的表。
DataAdapter填充DataSet的過程分為二步:首先通過DataAdapter的SelectCommand屬性從資料庫中檢索出需要的資料。SelectCommand其實是一個Command對象。然後再通過DataAdapter的Fill方法把檢索來的資料填充 DataSet。代碼清單01就是以Microsoft SQL Server 中的Northwind資料庫為對象,C#使用The SQL Server .NET Data Provider中的SqlDataAdapter填充DataSet的具體實現方法:
代碼清單01:
SqlConnection sqlConnection1 = new SqlConnection ( "Data Source=localhost ;Integrated Security=SSPI ;Initial Catalog=Northwind" ) ; //建立資料連線 SqlCommand selectCMD = new SqlCommand ( "SELECT CustomerID , CompanyName FROM Customers" , sqlConnection1 ) ; //建立並初始化SqlCommand對象 SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter ( ) ; custDA.SelectCommand = selectCMD ; sqlConnection.Open ( ) ; //建立SqlDataAdapter對象,並根據SelectCommand屬性檢索資料 DataSet dsDataSet1 = new DataSet ( ) ; sqlDataAdapter1.Fill ( dsDataSet1 , "Customers" ) ; //使用SqlDataAdapter的Fill方法填充DataSet sqlConnection.Close ( ) ; //關閉資料連線 |
對於其他資料提供者的DataAdapter,具體的實現檢索資料庫中的資料並填充DataSet的實現方法類似於以上方法。
2. 通過DataAdapter對象操作DataSet實現更新資料庫:
DataAdapter是通過其Update方法實現以DataSet中資料來更新資料庫的。當DataSet執行個體中包含資料發生更改後,此時調用Update方法,DataAdapter 將分析已作出的更改並執行相應的命令(INSERT、UPDATE 或 DELETE),並以此命令來更新資料庫中的資料。如果DataSet中的DataTable是映射到單個資料庫表或從單個資料庫表產生,則可以利用 CommandBuilder 對象自動產生 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。使用DataAdapter對象操作DataSet實現更新資料庫具體的實現方法,只需把下面的代碼清單02添加到代碼清單01之後,二者合并即可實現刪除Customers資料表中第一行資料:
代碼清單02:
SqlCommandBuilder sqlCommandBuilder1 = new SqlCommandBuilder ( sqlDataAdapter1 ) ; //以sqlDataAdapter1為參數來初始化SqlCommandBuilder執行個體 dsDataSet1.Tables["Customers"].Rows[0].Delete ( ) ; //刪除DataSet中刪除資料表Customers中第一行資料 sqlDataAdapter1.Update ( dsDataSet1 ,"Customers" ) ; //調用Update方法,以DataSet中的資料更新從資料庫 dsDataSet1.Tables["Customers"].AcceptChanges ( ) ; |
由於不瞭解DataSet結構和與資料庫關係,很多初學者往往只是更新了DataSet中的資料,就認為資料庫中的資料也隨之更新,所以當開啟資料庫瀏覽時發現並沒有更新資料,都會比較疑惑,通過上面的介紹,疑惑應當能夠消除了。
3. XML和DataSet:
DataSet中的資料可以從XML資料流或文檔建立。並且.Net Framework可以控制載入XML資料流或文檔中那些資料以及如何建立DataSet的關係結構。載入XML資料流和文檔到DataSet中是可使用DataSet對象的ReadXml方法(注意:ReadXml來載入非常大的檔案,則效能會有所下降)。ReadXml 方法將從檔案、流或 XmlReader 中進行讀取,並將 XML 的源以及可選的 XmlReadMode 參數用作參數。該ReadXml方法讀取 XML 流或文檔的內容並將資料載入到 DataSet 中。根據所指定的XmlReadMode和關係架構是否已存在,它還將建立DataSet的關係架構。
三.DataSet和資料繫結(DataBinding)
資料繫結是資料繫結是綁定技術中使用最頻繁,也是最為重要的技術,也可以說是各種.Net開發語言開發資料庫應用程式最需要掌握的基本的知識之一。資料繫結之所以很重要,是因為在.Net FrameWork SDK中並沒有提供資料庫開發的相關組件,即如:DbTextBox、DbLabel等用於資料庫開發的常用組件在.Net FrameWork SDK中都沒有。而資料繫結技術則能夠把TextBox組件"改造"成DbTextBox組件,把Label組件"改造"成DbLabel組件等等。所有這些都與DataSet有直接關係。
資料繫結分成二類:簡單型資料繫結和複雜型資料繫結。適用於簡單型資料繫結組件一般有Lable、TextBox等,適用於複雜性資料繫結的組件一般有DataGrid、ListBox、ComboBox等。其實簡單型資料繫結和複雜性資料繫結並沒有明確的區分,只是在組件進行資料繫結時,一些結構複雜一點的組件在資料繫結時操作步驟相近,而另外一些結構簡單一點的組件在資料繫結時也比較類似。於是也就產生了二個類別。以下就結合TextBox組件和DataGrid組件分別探討DataSet在實現簡單型資料繫結和複雜性資料繫結作用和具體實現方法。
1. 簡單型資料繫結:
簡單型資料繫結一般使用這些組件中的DataBindings屬性的Add方法把DataSet中某一個DataTable中的某一行和組件的某個屬性綁定起來,從而達到顯示資料的效果。TextBox組件的資料繫結具體實現方法是在代碼清單01後,再添加代碼清單03中的代碼,代碼清單03中的代碼是把DataSet中的Customers 資料表中的"CustomerID"的資料和TextBox的Text屬性綁定起來,這樣DbTextBox就產生了。其他適用於簡單型資料繫結組件資料繫結的方法類似與此操作:
代碼清單03:
| textBox1.DataBindings.Add ( "Text" , dsDataSet1, " Customers. CustomerID " ) ; |
2. 複雜性資料繫結:
複雜性資料繫結一般是設定組件的DataSource屬性和DisplayMember屬性來完成資料繫結的。DataSource屬性值一般設定為要綁定的DataSet,DisplayMember屬性值一般設定為要繫結資料表或資料表中的某一列。DataGrid組件的資料繫結的一般實現方法是在代碼清單01後,再添加代碼清單04中的代碼,代碼清單04的功能是把DataSet中的Customers 資料表和DataGrid綁定起來。其他適用於複雜性資料繫結的組件實現資料繫結的方法類似此操作:
代碼清單04:
dataGrid1.DataSource = dsDataSet1 ; dataGrid1.DataMember = " Customers " ; |
四.總結
DataSet類是ADO.NET中一個非常重要的核心成員,它是資料庫中的資料在本機電腦中映射成的緩衝。對DataSet的任何操作,都是在電腦緩衝中完成的。理解這一點是掌握DataSet的第一步。DataSet雖然結構複雜。但只要區分DataSet對象中各個組成組件及其相互關係,掌握也不算太困難。本文覆蓋了DataSet的特性、結構、以及具體的使用方法等等,相信這些對您掌握這個ADO.NET中核心成員是有