ADO.NET入門教程(八) 深入理解DataAdapter(上)


摘要

ADO.NET有兩個核心組件:基於連接的Data Provider組件以及基於非連接的DataSet組件。基於連接的Data Provider組件常用於實時地從數據庫中檢索數據。而基於非連接的DataSet,似乎與數據庫沒有直接聯系,僅僅用於在本地內存中存儲Data Provider提供的數據表或集合。這一切似乎很微妙,此時,你是否在想:這兩大組件是如何聯系在一起的呢?或許,通過閱讀本文會或多或少解除你的一些疑惑呢!


目錄


1. 認識DataAdapter

      前面我所講的對象中,譬如Connection對象,Command對象以及DataReader對象,這些對象均屬於Data Provider的一部分,而且都是基於連接的。擁有強大功能的它們,讓你可以很輕松地連接一個特定的數據源,執行SQL語句,檢索只讀的數據流等等。這些基於連接的對象都對應於特定的數據源。換句話說,對於不同的數據源,我們需要找到對應的數據庫提供程序(Data Provider)來匹配他們。當然,你也不必為此感到困惑和緊張,在前面我已經講得很詳細了。或許,以目前我們所學的知識,對於操作數據源以及檢索數據完全沒有什么問題呢!但是,這並沒有發揮出ADO.NET的優勢。如果,每次我們檢索數據庫中的表或者行都需要連接一次數據庫,那么性能和效率是十分低下的。實際上,ADO.NET提供了基於非連接的核心組件:DataSet。DataSet組件讓我們可以很愉快地在內存中操作以表為中心的數據集合,就好比操作數據庫中的表一樣。這是多么讓人興奮和激動啊!

      不知道大家有沒有想過這樣一個問題(反正我是想了):既然DataSet是基於非連接的(不需要連接數據庫),那么它存儲的數據集合是從哪里來呢?實際上,很多時候,它的數據還是來自於數據庫。Oh!這似乎有點自相矛盾了!打個“不雅”的比喻:就好比沒有雞,那哪來的蛋呢?你不妨換個角度來思考問題!雖然,你沒有養雞,但是,你不是還可以從超市或者其他零售店買到雞蛋嗎?同理,盡管DataSet沒有直接連接數據庫,但是,ADO.NET早就為DataSet准備了一位非常謙虛友善的中介:DataApdater。DataApater數據適配器,就是這樣一個對象:它為外部數據源與本地DataSet集合架起了一座堅實的橋梁,將從外部數據源檢索到的數據合理正確的調配到本地的DataSet集合中

 

2. DataAdapter的工作原理

      要說DataAdapter是ADO.NET世界里最為復雜的部分,其實也不為過!但是,我們也不必驚慌。盡管DataAdater內部實現機制較為復雜,但是提供開發人員的接口卻是異常的簡單。我們知道,DataApapter本質上就是一個數據調配器。當我們需要查詢數據時,它從數據庫檢索數據,並填充要本地的DataSet或者DataTable中;當我需要更新數據庫時,它將本地內存的數據路由到數據庫,並執行更新命令。下面我們以Customer表為例,來理解DataAdapter的工作原理。下圖詳細描述了一個DataAdapter的工作過程。

 

                                        圖2.1  DataAdapter執行過程圖

      從上圖我們可以清楚的知道,當我查詢Customer信息,DataAdapter首先將構造一個SelectCommand實例(本質就一個Command對象),然后檢查是否打開連接,如果沒有打開連接則打開連接,緊接着調用DataReader接口檢索數據,最后根據維護的映射關系,將檢索到得數據庫填充到本地的DataSet或者DataTable中。同理,我們需要更新數據源時,DataAdatper則將本地修改的數據,跟據映射關系,構造InsertCommand,UpdateCommnad,DeleteCommand對象,然后執行相應的命令。

      之所以說,DataAdapter是最復雜的ADO.NET組件,是因為它是架構在所有其他DataProvider對象之上的。Connection對象,DataReader對象,Paramter對象以及Command對象,都盡可能的為它服務。總體來說,DataAdapter主要有三大功能:

  • 數據檢索:盡可能用最簡單的方法填充數據源到本地DataSet或者DataTable中。細致的說,DataAdapter用一個DataReader實例來檢索數據,因此你必須提供一個Select查詢語句以及一個連接字符串。
  • 數據更新:將本地修改的數據返回給外部的數據源相對來說稍微復雜一點。即使,從數據庫查詢數據時,我們僅僅只需要一條基本的Select語句,而更新數據庫則需要區分Insert,Update,Delete語句。
  • 表或列名映射:維護本地DataSet表名和列名與外部數據源表名與列名的映射關系。

 

3. 說說DataAdapter的重要成員

      作為.NET DataProvider對象成員之一,DataAdapter跟其他數據提供對象具有相似的特征:都是基於連接的,都繼承於基類,不同的數據源都對應自己的派生版本。這樣理解的話,學習DataAdapter似乎簡單的多。DataAdapter的基類是DBDataAdapter,它的結構如下:

public abstract class DbDataAdapter : DataAdapter, 
IDbDataAdapter, IDataAdapter, ICloneable

      從上面我們可以看到,DBDataAdapter是一個抽象基類,不能被實例化,並且繼承DataAdapter類,IDBDataApdater,IdataAdapter以及Icloneable接口。DataAdapter成員較多,必須掌握的有以下幾種:

  • SelectComand屬性:獲取或設置用於在數據源選擇記錄的命令。
  • UpdateCommand屬性:獲取或這只用於更新數據源中的記錄的命令。
  • DeleteCommand屬性:獲取或設置用於從數據源中刪除記錄的命令。
  • InsertCommand屬性:獲取或設置用於將新記錄插入數據源中的命令。
  • Fill方法:填充數據集。
  • Update方法:更新數據源。

 

4. 總結

       本文我主要從"WHY"與"WHAT"的角度詳細講解了DataAdapter的工作原理以及主要作用。后續的文章,我將圍繞"HOW"來詳細分析DataAdapter的實際應用。如果文章對園友們有幫助,希望能得到您的推薦關注。您的肯定和支持是我繼續寫作的最大動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM