《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 设计应用 > 基于.NET的数据访问策略研究与实现
基于.NET的数据访问策略研究与实现
毛 莉1, 刘广强2
摘要: 基于.NET构架的四种数据访问策略,以及这些策略对连接数据源的要求和数据库读取方式的内部运行机制。
關(guān)鍵詞: 数据库 数据访问 .NET
Abstract:
Key words :

  摘  要: 基于.NET構(gòu)架的四種數(shù)據(jù)訪問(wèn)策略,以及這些策略對(duì)連接數(shù)據(jù)源的要求和數(shù)據(jù)庫(kù)讀取方式的內(nèi)部運(yùn)行機(jī)制。
  關(guān)鍵詞: 數(shù)據(jù)提供程序  .NET  Data Access

   .NET提供了編寫分布式應(yīng)用程序的模型,此模型簡(jiǎn)單明了,功能強(qiáng)大。ADO.NET是.NET中對(duì)數(shù)據(jù)存取問(wèn)題的解決方案。.NET定義了二種數(shù)據(jù)提供程序(SQL Server.NET和OLE DB.NET)來(lái)連接數(shù)據(jù)源,提供了DataReader和DataSet二種方法讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。本文結(jié)合具體實(shí)例介紹使用不同的策略訪問(wèn)數(shù)據(jù)庫(kù)的方法,并歸納總結(jié)了各種數(shù)據(jù)庫(kù)訪問(wèn)策略適用于何種系統(tǒng)環(huán)境。
1  .NET數(shù)據(jù)提供程序和數(shù)據(jù)讀取方式簡(jiǎn)介
1.1 .NET數(shù)據(jù)提供程序

  .NET數(shù)據(jù)提供程序是為連接到特定數(shù)據(jù)源而優(yōu)化的專門類集,它通過(guò)繼承System Data中的IdbAdapter接口來(lái)構(gòu)建。目前的.NET SDK版本中,Microsoft提供了二個(gè)數(shù)據(jù)提供程序。如圖1所示:①SQL Server.NET數(shù)據(jù)提供程序用于連接到Microsoft  SQL  Server 7.0和更高級(jí)版本上。②OLE DB.NET數(shù)據(jù)提供程序是常規(guī)的數(shù)據(jù)提供程序,用于連接到任何經(jīng)過(guò)傳統(tǒng)OLE  DB提供程序訪問(wèn)的任何其他數(shù)據(jù)源。

 


1.2 數(shù)據(jù)讀取方式
  ADO.NET提供DataSet和DataReader二種不同的方式讀取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。DataReader提供只向前的讀取方法,通過(guò)執(zhí)行命令在數(shù)據(jù)源生成結(jié)果集。一次只能使用單個(gè)結(jié)果集,如果要同時(shí)使用一個(gè)以上的結(jié)果集,就需要有多個(gè)活動(dòng)的DataReader;DataSet是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),它能保存幾個(gè)表,可以使某個(gè)內(nèi)部表與其他內(nèi)部表相關(guān)聯(lián),還可以管理對(duì)數(shù)據(jù)的約束條件并暫存數(shù)據(jù)。
1.3 訪問(wèn)數(shù)據(jù)庫(kù)策略
  在訪問(wèn)數(shù)據(jù)源時(shí),首先需要連接數(shù)據(jù)庫(kù),然后將數(shù)據(jù)庫(kù)中的數(shù)據(jù)讀取到內(nèi)存中,再對(duì)數(shù)據(jù)進(jìn)行操作。這樣就存在四種訪問(wèn)數(shù)據(jù)庫(kù)策略,如表1所示。

 


2  基于不同策略訪問(wèn)數(shù)據(jù)源的示例
2.1 在SQL Server中使用DataSet

  本例將查詢SQL Server數(shù)據(jù)庫(kù)。首先將數(shù)據(jù)存儲(chǔ)到DataSet中,然后顯示這些數(shù)據(jù)。假設(shè)服務(wù)器名為HPDB,將SQL Server數(shù)據(jù)庫(kù)實(shí)例名定義為TEST,用戶名為SA,密碼為空,關(guān)系名為EmpList。數(shù)據(jù)結(jié)構(gòu)如表2所示。


  該操作步驟如下:
  (1)使用SQL Server7.0數(shù)據(jù)庫(kù)的SqlConnection連接數(shù)據(jù)庫(kù)。
  (2)創(chuàng)建一個(gè)DataSet對(duì)象。
  (3)使用SqlDataAdapter對(duì)象的Fill( )方法,將數(shù)據(jù)庫(kù)中的數(shù)據(jù)加載到DataSet中。
  (4)利用DataSet對(duì)象的Tables方法指定DataTables集合的錨點(diǎn)。
  (5)利用Foreach的嵌套操作顯示EmpList表中的數(shù)據(jù)。
  以下為該示例程序的完整代碼:
  

  

  運(yùn)行結(jié)果如表3所示。


2.2 在OLE DB數(shù)據(jù)源中使用DataReader
  OLE DB數(shù)據(jù)源是指具有OLE DB驅(qū)動(dòng)程序的任何數(shù)據(jù)源,其中包括Access、Oracle、DB2、SQL Server6.0版本或更早期版本。本例是連接到Microsoft Access 7.0數(shù)據(jù)源,關(guān)系名為EmpList,數(shù)據(jù)結(jié)構(gòu)如表2。
  操作步驟如下:
  (1)使用Microsoft Access數(shù)據(jù)庫(kù)的OLE DB 連接數(shù)據(jù)庫(kù)。
  (2)通過(guò)將SQL SELECT 語(yǔ)句和OleDbConnection對(duì)象作為參數(shù)傳遞到重載構(gòu)造函數(shù)來(lái)創(chuàng)建OleDbCommand對(duì)象。
  (3)調(diào)用OleDbCommand對(duì)象的ExecuteReader( )方法并存儲(chǔ)返回的OleDbDataReader對(duì)象。
  (4)調(diào)用OleDbDataReader對(duì)象的Read( )方法,在屏幕上打印結(jié)果,直到返回false為止。
  (5)如果出現(xiàn)異常,發(fā)出消息。
  該示例的代碼如下:
  

  

  運(yùn)行結(jié)果同表3。
3  比  較
3.1 比較二種不同的數(shù)據(jù)連接方式
  ADO.NET提供了一組功能強(qiáng)大的類,用于連接到數(shù)據(jù)庫(kù)、執(zhí)行SQL語(yǔ)句和調(diào)用存儲(chǔ)過(guò)程。使用SqlConnection類就可以連接到SQL  Server 7.0和更高級(jí)版本,而使用OleDbConnection類可以連接到SQL Server數(shù)據(jù)庫(kù)6.0版本或更早期版本以及其他OLE DB數(shù)據(jù)源。連接到數(shù)據(jù)庫(kù)必須使用恰當(dāng)?shù)?NET數(shù)據(jù)提供程序。
  由于.NET數(shù)據(jù)提供程序具有與SQL  Server進(jìn)行信息交流的能力,所以訪問(wèn)數(shù)據(jù)速度相當(dāng)快。但是并非每個(gè)用戶都使用SQL Server。所以O(shè)LE DB保留了仍然受到廣泛支持的訪問(wèn)數(shù)據(jù)標(biāo)準(zhǔn)。事實(shí)上,在開發(fā)更多被優(yōu)化用于特定數(shù)據(jù)庫(kù)的數(shù)據(jù)提供程序之前,OLE DB類只是權(quán)宜之計(jì)。無(wú)論是從數(shù)據(jù)連接、數(shù)據(jù)提取、數(shù)據(jù)更新方面,SQL Server.NET提供程序的執(zhí)行效率比OLE DB.NET提供程序都具有明顯優(yōu)勢(shì)。
3.2 比較二種不同的數(shù)據(jù)庫(kù)讀取方式
  使用DataReader可以處理連接數(shù)據(jù),一次只載入一行數(shù)據(jù),這樣能提高應(yīng)用程序的總性能并降低系統(tǒng)開銷。雖然DataReader運(yùn)行速度很快,但是其功能非常有限。DataReader提供的數(shù)據(jù)不能被修改,DataReader的標(biāo)準(zhǔn)上沒(méi)有引用以前提供數(shù)據(jù)元素的方法,DataReader需要數(shù)據(jù)庫(kù)持久的、活動(dòng)的連接。
  DataSet是ADO.NET中的主類,因?yàn)樗试S表示客戶端上的多個(gè)表、關(guān)系和約束條件,甚至可以將整個(gè)數(shù)據(jù)庫(kù)保存在客戶端,能將對(duì)數(shù)據(jù)庫(kù)的修改推回到數(shù)據(jù)存儲(chǔ)器中。DataSet能有效地為從數(shù)據(jù)源中讀取的數(shù)據(jù)提供內(nèi)存高速緩存。與DataReader不同,它會(huì)讀取并將整個(gè)數(shù)據(jù)立即保存到內(nèi)存中。一旦填充完數(shù)據(jù),DataSet就會(huì)完全從其原始數(shù)據(jù)源斷開。
  與其他任何工具一樣,DataReader和DataSet也都適合于某些特定的應(yīng)用。例如,DataReader適用于快速獲取綁定到只讀空間的大量數(shù)據(jù),而DataSet則更適用于編輯合并來(lái)自多個(gè)數(shù)據(jù)源的數(shù)據(jù)。
4  總  結(jié)
  使用ADO.NET訪問(wèn)數(shù)據(jù)時(shí),如果數(shù)據(jù)源是SQL  Server7.0或更高級(jí)版本,則建議采用SqlConnection類進(jìn)行數(shù)據(jù)庫(kù)連接;如果數(shù)據(jù)源是SQL Server數(shù)據(jù)庫(kù)6.0版本或更早期版本以及其他DBMS,則只能使用OleDbConnection類;如果只是在Web窗體中簡(jiǎn)單顯示數(shù)據(jù),則將幾十行的數(shù)據(jù)“推入”DataSet是沒(méi)有意義的,建議使用DataReader。同理,使用DataReader填充編輯時(shí)保存數(shù)據(jù)的集合,然后編寫已修改數(shù)據(jù)填充回?cái)?shù)據(jù)源的方法非常低效,這時(shí)建議使用DataSet。
參考文獻(xiàn)
1   Ferracchiati F C,Glynn J. .NET數(shù)據(jù)服務(wù)C#高級(jí)編程.北京:清華大學(xué)出版社,2001
2   金燦. .NET框架中三種數(shù)據(jù)訪問(wèn)技術(shù)及效率比較.計(jì)算機(jī)應(yīng)用研究,2003;(4)
3   Dickinson P. ADO.NET高級(jí)編程.北京:中國(guó)電力出版社,2003
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。

相關(guān)內(nèi)容