幾乎在每次面試的時候都會被問道這個問題。使用.net開發當中讀取資料應該採用sqldatareader 還是dataset以及對這兩者的理解。
先來談談我本人對這兩者的理解:
1、sqldatareader:提供一種從sql server 資料庫讀取行的只進流的方式。無法繼承此類。白話解釋就是 使用這個物件可以從資料庫中讀取唯讀類的資料。所謂唯讀,可以理解為一頭走到死,不撞南牆不回頭。就好比割麥機收麥子一樣,這一茬過去了後邊就沒有了。(千萬不要理解為資料庫中的資料是唯讀的)
那麼在什麼情況下我們才會用到sqldatareader這個物件呢?
首先、從資料庫中讀取乙個實體物件的時候我們可以用到sqldatareader
其次、讀取一系列(列表)資料的時候可以用到sqldatareader.
需要注意的是。在使用sqldatareader讀取完資料之後要對其進行顯式close.否則他和資料庫就一直連線著,占用記憶體不說,還容易出現問題。
如果使用完成之後顯示將其銷毀,這個時候他已經不在占用記憶體等等耗費資源的東西了!
2、dataset:msdn(dataset是ado.net的中心概念。可以把dataset當成記憶體中的資料庫,dataset是不依賴於資料庫的獨立資料集合。所謂獨立,就是說,即使斷開資料鏈路,或者關閉資料庫,dataset依然是可用的,dataset在內部是用xml來描述資料的,由於xml是一種與平台無關、與語言無關的資料描述語言,而且可以描述複雜關係的資料,比如父子關係的資料,所以dataset實際上可以容納具有複雜關係的資料,而且不再依賴於資料庫鏈路。)
白話解釋:dataset 是乙個資料集合,是存放在記憶體中的。相當於乙個存放在記憶體中的資料庫(資料集合)並且不依賴於資料庫。
相比sqldatareader,dataset的好處就是在於資料庫斷開連線之後。dataset仍然儲存在記憶體中,可以隨意對其進行操作,比如,刪除row,合併,追加,修改某個資料等等。
需要注意的是,由於dataset是讀取後可以立刻關閉和資料庫的連線,這個時候dataset就會存在記憶體中的。所以在等待gc自動**之前,他一直占用系統資源。對於我們讀取列表來說,把這樣一堆資料存在伺服器記憶體中顯然不是明智的選擇。
伺服器記憶體是有限的。程式中如果存在大量沒有被gc**的dataset ,後果……….
開發中對於sqldatareader和dataset的選擇以及取捨
如前文所述,幾乎每次面試的時候都會被問道這個問題。我相信very very much 的童鞋對這兩者的區別已經相當的瞭如指掌,甚至達到爐火純青的地步。
但是,我看到過大多數的程式。包括我如今新的新公司現有的專案,我幾乎找不到sqldatareader的影子。為什麼呢?
在這裡我有個疑問,也就是為什麼大家會選擇dataset而不是sqldatareader來讀取資料? 很顯然,如果答案是dataset更方便那是非常扯淡的!
我需要糾正的一點是:此「隨意操作」非彼「隨意操作」,關於dataset可以脫離資料庫而在記憶體中隨意操作的理解我認為是這樣的:「可以對dataset資料集合中的資料進行一系列的操作。比如合併資料,統計資料,修改資料,刪除資料等等(當然這裡舉例可以不太確切)然後返回乙個修改後的dataset」。而事實上我見到的情況是 :僅僅在頁面(畫面)顯示資料列表,每行資料後邊再帶個修改,刪除等等這種情況仍然是使用dataset.
關於以上問題。完全可以用sqldatareader 來替代,因為根本不存在什麼在記憶體中對列表進行操作的情況。為什麼不用sqldatareader 呢?我自認為dataset 相比sqldatareader 的優點也就只有這麼一點點(或許我理解還不夠,或許還有別的),但是在上述情景中他這麼點有點已經蕩然無存,毫無用武之地,為什麼還要把他存在記憶體中來耗費那麼一點點系統資源的?
sqldatareader 相比dataset 的優點我相信各位看客都在心裡非常非常的清楚。但是實際上很少有人去使用sqldatareader而偏向喜歡dataset,我不知道為什麼。
或許很大一部分人都還處在剛畢業的水平吧!有或者是別的什麼原因。
當我看到公司現有專案中
a、) 沒有乙個sqldatareader .全部都是 使用dataset來做sqldatareader 的事情
b、) 存在大量可以避免的頁面回發
c、) 存在大量無用的viewstate
d、) asp.net **前台資料列表顯示用的gridview .
的時候我把我的簽名改成 「我內傷了!」
或許以上我的說法您不認可,不過沒關係。我也抱著學習的態度虛心接受您的建議。
關於SqlDataReader遍歷和快取結果集
大家都知道,datareader是效率比較高的獲取資料的方式,但是,讀取資料後我們必須及時關閉datareader,否則反而會占用資料連線的資源,如果有很多datareader沒有及時關閉,就會可能發生資料庫連線池超出鏈結數最大限制的錯誤。有時候需要從資料庫獲得乙個查詢的結果集,然後遍歷這個結果集,...
SqlDataReader 之指定轉換無效
獲取最新顯示順序資料 string str string.format if exists select showorder from gis funcdefaultlayer where gisfuncid select max showorder as showorder from gis fu...
SqlDataReader類的初次使用誤區
using sqlcommand cmd connect.createcommand 將資料庫中的檔案通過select語句讀出來,看別人家這麼寫能夠通過但我的就不行了 前面的資料庫連線部分略了啊 我的就是不行,只能用上面注釋的那一行才行。還不明白啥原因,暫記一下,找到原因再補充。哎,上面的問題的確狗...