国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

剖析 .Net 下的數據訪問層技術(二)

2024-07-10 13:03:39
字體:
來源:轉載
供稿:網友
其它

結束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!)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 榆林市| 韩城市| 论坛| 沛县| 陇南市| 上虞市| 徐水县| 天水市| 新竹县| 广宗县| 博爱县| 大洼县| 鄯善县| 大厂| 宝应县| 望谟县| 富平县| 枣庄市| 新乡市| 两当县| 宁津县| 句容市| 深水埗区| 鄂尔多斯市| 芷江| 鸡泽县| 章丘市| 凭祥市| 北京市| 阳曲县| 宁津县| 巴南区| 上杭县| 武隆县| 余干县| 富民县| 虞城县| 湾仔区| 民县| 吴川市| 青海省|