摘 要: 基于.NET構架的四種數據訪問策略,以及這些策略對連接數據源的要求和數據庫讀取方式的內部運行機制。
關鍵詞: 數據提供程序 .NET Data Access
.NET提供了編寫分布式應用程序的模型,此模型簡單明了,功能強大。ADO.NET是.NET中對數據存取問題的解決方案。.NET定義了二種數據提供程序(SQL Server.NET和OLE DB.NET)來連接數據源,提供了DataReader和DataSet二種方法讀取數據庫中的數據。本文結合具體實例介紹使用不同的策略訪問數據庫的方法,并歸納總結了各種數據庫訪問策略適用于何種系統環境。
1 .NET數據提供程序和數據讀取方式簡介
1.1 .NET數據提供程序
.NET數據提供程序是為連接到特定數據源而優化的專門類集,它通過繼承System Data中的IdbAdapter接口來構建。目前的.NET SDK版本中,Microsoft提供了二個數據提供程序。如圖1所示:①SQL Server.NET數據提供程序用于連接到Microsoft SQL Server 7.0和更高級版本上。②OLE DB.NET數據提供程序是常規的數據提供程序,用于連接到任何經過傳統OLE DB提供程序訪問的任何其他數據源。

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

2 基于不同策略訪問數據源的示例
2.1 在SQL Server中使用DataSet
本例將查詢SQL Server數據庫。首先將數據存儲到DataSet中,然后顯示這些數據。假設服務器名為HPDB,將SQL Server數據庫實例名定義為TEST,用戶名為SA,密碼為空,關系名為EmpList。數據結構如表2所示。

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


運行結果如表3所示。

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



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