熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

深入分析ADO.NET中的DataSet對象

2013-11-13 10:46:34  來源: .NET編程 
  ADONET是Net FrameWork SDK中用以操作數據庫的類庫的總稱而DataSet類則是ADONET中最核心的成員之一也是各種開發基於Net平台程序語言開發數據庫應用程序最常接觸的類之所以DataSet類在ADONET中具有特殊的地位是因為DataSet在ADONET實現從數據庫抽取數據中起到關鍵作用在從數據庫完成數據抽取後DataSet就是數據的存放地它是各種數據源中的數據在計算機內存中映射成的緩存所以有時說DataSet可以看成是一個數據容器同時它在客戶端實現讀取更新數據庫等過程中起到中間部件的作用(DataReader只能檢索數據庫中的數據)

  各種Net平台開發語言開發數據庫應用程序一般並不直接對數據庫操作(直接在程序中調用存儲過程等除外)而是先完成數據連接和通過數據適配器填充DataSet對象然後客戶端再通過讀取DataSet來獲得需要的數據同樣更新數據庫中數據也是首先更新DataSet然後再通過DataSet來更新數據庫中對應的數據的可見了解掌握ADONET首先必須了解掌握DataSetDataSet主要有三個特性

   獨立性DataSet獨立於各種數據源微軟公司在推出DataSet時就考慮到各種數據源的多樣性復雜性Net中無論什麼類型數據源它都會提供一致的關系編程模型而這就是DataSet

   離線(斷開)和連接DataSet既可以以離線方式也可以以實時連接來操作數據庫中的數據這一點有點像ADO中的RecordSet

   DataSet對象是一個可以用XML形式表示的數據視圖是一種數據關系視圖

  DataSet對象的結構模型及和RecordSet的比較

  雖說ADONET是 ADO在Net平台下得後繼版本但二者的區別是很大的突出表現在ADO中的RecordSet對象和ADONET中的DataSet對象RecordSet其實也是非常靈活的一個對象微軟公司推出它也是煞費苦心RecordSet可以離線操作數據庫性能優良效率較高等等這些都讓當時的程序員為之一振RecordSet雖然已經很復雜但DataSet卻比RecordSet復雜的多我們知道每一DataSet往往是一個或多個DataTable 對象的集合這些對象由數據行和數據列以及主鍵外鍵約束和有關DataTable對象中數據的關系信息組成而RecordSet只能存放單張數據表雖然這張數據表可以由幾張數據表JOIN生成所以有些時候說RecordSet更類似於DataSet中的DataTableDataSet對象的結構模型如圖所示



DataSet對象的結構模型圖

  通過圖可見在DataSet對象結構還是非常復雜的在DataSet對象的下一層中是DataTableCollection對象DataRelationCollection對象和ExtendedProperties對象上文已經說過每一個DataSet對象是由若干個DataTable對象組成DataTableCollection就是管理DataSet中的所有DataTable對象表示DataSet中兩個DataTable對象之間的父/子關系是DataRelation對象它使一個DataTable 中的行與另一個DataTable中的行相關聯這種關聯類似於關系數據庫中數據表之間的主鍵列和外鍵列之間的關聯DataRelationCollection對象就是管理DataSet中所有DataTable之間的DataRelation關系的在DataSet中DataSetDataTable和DataColumn都具有ExtendedProperties屬性ExtendedProperties其實是一個屬性集(PropertyCollection)用以存放各種自定義數據如生成數據集的SELECT語句等

  二.使用DataSet

  DataSet其實就是數據集上文已經說過DataSet是把數據庫中的數據映射到內存緩存中的所構成的數據容器對於任何數據源它都提供一致的關系編程模型在DataSet中既定義了數據表的約束關系以及數據表之間的關系還可以對數據表中的數據進行排序等DataSet使用方法一般有三種

   把數據庫中的數據通過DataAdapter對象填充DataSet

   通過DataAdapter對象操作DataSet實現更新數據庫

   把XML數據流或文本加載到DataSet

  下面就來詳細探討以上DataSet使用方法的具體實現使用語言是C#

   把數據庫中的數據通過DataAdapter對象填充DataSet

  掌握DataSet使用方法必須掌握ADONET另外一個核心常用成員數據提供者(Data Provider)數據提供者(也稱為托管提供者Managed Provider)是一個類集合Net FrameWork SDK 中數據提供者分為二種The SQL Server NET Data Provider和The OLE DB NET Data Provider而到了Net FrameWork SDK ADONET中又增加了The ODBC NET Data Provider和 The Oracle NET Data Provider二個數據提供者The SQL Server NET Data Provider的操作數據庫對象只限於Sql Server 及以上版本Oracle NET Data Provider的操作數據庫對象只限於Oracle 及以上版本而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代碼清單就是以Microsoft SQL Server 中的Northwind數據庫為對象C#使用The SQL Server NET Data Provider中的SqlDataAdapter填充DataSet的具體實現方法

  代碼清單

  SqlConnection sqlConnection = new SqlConnection ( Data Source=localhost      ;Integrated Security=SSPI ;Initial Catalog=Northwind ) ;
  //創建數據連接
  SqlCommand selectCMD = new SqlCommand ( SELECT CustomerID CompanyName FROM    Customers sqlConnection ) ;
  //創建並初始化SqlCommand對象
  SqlDataAdapter sqlDataAdapter = new SqlDataAdapter ( ) ;
  custDASelectCommand = selectCMD ;
  sqlConnectionOpen ( ) ;
  //創建SqlDataAdapter對象並根據SelectCommand屬性檢索數據
  DataSet dsDataSet = new DataSet ( ) ;
  sqlDataAdapterFill ( dsDataSet Customers ) ;
  //使用SqlDataAdapter的Fill方法填充DataSet
  sqlConnectionClose ( ) ;
  //關閉數據連接

  對於其他數據提供者的DataAdapter具體的實現檢索數據庫中的數據並填充DataSet的實現方法類似於以上方法

   通過DataAdapter對象操作DataSet實現更新數據庫

  DataAdapter是通過其Update方法實現以DataSet中數據來更新數據庫的當DataSet實例中包含數據發生更改後此時調用Update方法DataAdapter 將分析已作出的更改並執行相應的命令(INSERTUPDATE 或 DELETE)並以此命令來更新數據庫中的數據如果DataSet中的DataTable是映射到單個數據庫表或從單個數據庫表生成則可以利用 CommandBuilder 對象自動生成 DataAdapter 的 DeleteCommandInsertCommand 和 UpdateCommand使用DataAdapter對象操作DataSet實現更新數據庫具體的實現方法只需把下面的代碼清單添加到代碼清單之後二者合並即可實現刪除Customers數據表中第一行數據

  代碼清單 

  SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter) ;
  //以sqlDataAdapter為參數來初始化SqlCommandBuilder實例
  dsDataSetTables[Customers]Rows[]Delete ( ) ;
  //刪除DataSet中刪除數據表Customers中第一行數據
  sqlDataAdapterUpdate ( dsDataSet Customers ) ;
  //調用Update方法以DataSet中的數據更新從數據庫
  dsDataSetTables[Customers]AcceptChanges ( ) ;

  由於不了解DataSet結構和與數據庫關系很多初學者往往只是更新了DataSet中的數據就認為數據庫中的數據也隨之更新所以當打開數據庫浏覽時發現並沒有更新數據都會比較疑惑通過上面的介紹疑惑應當能夠消除了

   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中並沒有提供數據庫開發的相關組件即如DbTextBoxDbLabel等用於數據庫開發的常用組件在Net FrameWork SDK中都沒有而數據綁定技術則能夠把TextBox組件改造成DbTextBox組件把Label組件改造成DbLabel組件等等所有這些都與DataSet有直接關系

  數據綁定分成二類簡單型數據綁定和復雜型數據綁定適用於簡單型數據綁定組件一般有LableTextBox等適用於復雜性數據綁定的組件一般有DataGridListBoxComboBox等其實簡單型數據綁定和復雜性數據綁定並沒有明確的區分只是在組件進行數據綁定時一些結構復雜一點的組件在數據綁定時操作步驟相近而另外一些結構簡單一點的組件在數據綁定時也比較類似於是也就產生了二個類別以下就結合TextBox組件和DataGrid組件分別探討DataSet在實現簡單型數據綁定和復雜性數據綁定作用和具體實現方法

   簡單型數據綁定

  簡單型數據綁定一般使用這些組件中的DataBindings屬性的Add方法把DataSet中某一個DataTable中的某一行和組件的某個屬性綁定起來從而達到顯示數據的效果TextBox組件的數據綁定具體實現方法是在代碼清單再添加代碼清單中的代碼代碼清單中的代碼是把DataSet中的Customers 數據表中的CustomerID的數據和TextBox的Text屬性綁定起來這樣DbTextBox就產生了其他適用於簡單型數據綁定組件數據綁定的方法類似與此操作

  代碼清單

textBoxDataBindingsAdd ( Text dsDataSet Customers CustomerID ) ;

   復雜性數據綁定

  復雜性數據綁定一般是設定組件的DataSource屬性和DisplayMember屬性來完成數據綁定的DataSource屬性值一般設定為要綁定的DataSetDisplayMember屬性值一般設定為要綁定的數據表或數據表中的某一列DataGrid組件的數據綁定的一般實現方法是在代碼清單再添加代碼清單中的代碼代碼清單的功能是把DataSet中的Customers 數據表和DataGrid綁定起來其他適用於復雜性數據綁定的組件實現數據綁定的方法類似此操作

  代碼清單

dataGridDataSource = dsDataSet ;
dataGridDataMember = Customers ;

  四.總結

  DataSet類是ADONET中一個非常重要的核心成員它是數據庫中的數據在本地計算機中映射成的緩存對DataSet的任何操作都是在計算機緩存中完成的理解這一點是掌握DataSet的第一步DataSet雖然結構復雜但只要區分DataSet對象中各個組成部件及其相互關系掌握也不算太困難本文覆蓋了DataSet的特性結構以及具體的使用方法等等相信這些對您掌握這個ADONET中核心成員是有所幫助


From:http://tw.wingwit.com/Article/program/net/201311/14485.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.