剖析 .Net 下的資料訪問層技術(二)

來源:互聯網
上載者:User
訪問|資料 其它

結束ADO.NET剖析前,不得不提提DataReader與DataSet間的兄弟

之爭。

就作者所看過的資料,幾乎所有的都建議實際情況具體分析,剩下

很少很少的則全憑個人習慣決定。

在學習ADO.NET時,作者也是抱著這樣的想法,並反覆牢記資料

上總結的那些條款(就像當年學習GOF 23條時那樣,幾乎可以倒背如

流了J),想到終有一日也可在ADO.NET下大展神威了。



可惜現實不隨人願,連續做了幾個項目,無論規模大小,竟然全部

採用了DataSet解決方案!

此時,再回頭看看學習ADO.NET時開啟最為頻繁的PetShop項目,

兩相一比較,這才看出些許端倪。



簡單的說,PetShop採用了如下這種“曲線救國”的方式來實現資料

交換:



DataReader擷取資料 => 建立資料實體類 => 根據欄位類型填充數

據實體類 => 將資料實體添加到列表類中(僅針對返回超過一條資料的

場合)

(補充:採用資料實體類或者集合類可以比較方便的實現Cache Manament,

而普通的DataReader由於其資料讀取方式限制,無法滿足這種需求)



這個過程與DataAdapter.Fill() 所所產生的效果大同小異,只不過,

在Fill() 中DataAdpater自動建立DataReader去擷取資料,之後建立

DataTable(相當於資料實體類),並根據欄位類型填充DataTable,當然

,如果可能返回多條記錄,DataTable完全可以處理,就沒必要去實現列

表操作了。

可能讀者馬上產生了疑問:既然如此,PetShop中為何還需要資料實

體類呢?

這其中還是有一些差別的。

首先,資料實體類是輕量級的structure,一般僅包含資料欄位,沒有

什麼操作方法,這比DataTable或者DataRow還是有一些效能上的優勢

(在資料量不大時可以忽略不計);另一方面,資料實體類的操作相對

簡單,不需要開發人員具備任何ADO.NET知識(其實就DataTable來

說,這也不算什麼問題),點點屬性就可以了。

不過,根據作者的實踐來看,這兩方面似乎還不足以使人轉而使用

DataReader方案,理由列舉如下:



(1) 對於資料量較大的場合,可以採用分批讀取的方式,這有點類似DataGrid的資料分頁效果;



(2) 對於簡單的資料,實體類還能應付,一旦涉及關聯資料,就只能另外撰寫方法了。而所有這些,在DataSet中是非常容易處理的(對於企業級應用,大部分情況都需要處理比較複雜的資料);



(3) DataTable“天生”就支援資料集合操作,這樣的特性比“集合+實體”的混合模式(PetShop)更容易控制,也更自然;



(4) 實體類在聲明時需要確定所有資料類型,當進行資料填充時,就需要DataReader再次關注實體所對應的資料類型,不能有絲毫差錯!在這方面,DataTable就顯得非常方便,操作時只需要一次類型關注即可;



(5) DataSet解決方案可以非常方便的支援序列化操作(如:Remoting,WebServices),同時,與XML的關係更是親密無比,這對於和其它系統的互動來說也是至關重要的。



分析過一些技術和方案,相信讀者朋友已有一些體會。值此收官之際,如果非要在這裡提供一個“綜上所述”,那作者的建議就非常明確:



在企業級應用開發中,儘可能的採用DataSet(DataTable / DataView)+ Cache Management解決方案!



其它開發中,只在如下4種情況才考慮使用DataReader(就作者經驗來說,大部分使用DataReader都屬第2種情況):



(1) 對資源要求比較苛刻的場合,這裡的資源主要指記憶體和資料庫連接;



(2) 希望在讀取資料庫返回結果集時作自訂處理,例如:在讀取一條記錄後立刻終止處理,或者在讀取時作計算操作。

(提示:這種情況類似於XML中的SAX(Simple API for XML)技術,無需一次性讀入所有XML資料即可進行操作;相反的,DOM(Document Object Model)則要求必須裝載所有XML資料後才能開始操作(MSXML4.0已開始允許唯讀取XML文檔部分資料即可開始操作,這是後話)!)



(3) 只希望得到返回記錄數或者返回記錄的部分欄位,如:

string GetNameByID(int nID) //根據員工ID返回員工姓名,這裡只需要

// 讀取姓名欄位;

(提示:這種情況一般可以通過執行特定的查詢或預存程序直接解決)



(4) 出於某些方面的考慮(例如:n-Tier系統中嚴格區分各Layer間的職責),無法(或者禁止)通過資料庫本身進行查詢過濾,這時就只有使用DataReader在讀取時進行過濾操作!

(提示:雖然DataView也能達到這種目的,但它的過濾前提是必須讀取到所有返回資料,所以效能上不如DataReader!)





相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。