SqlDataReader是一個(gè)向前的指針,本身并不包含數(shù)據(jù),調(diào)用一次Read()方法它就向前到下一條記錄,一個(gè)SqlDataReader必須單獨(dú)占用一個(gè)打開的數(shù)據(jù)庫(kù)連接。
在使用 SqlDataReader時(shí),關(guān)聯(lián)的 SqlConnection 正忙于為 SqlDataReader 服務(wù),對(duì) SqlConnection 無法執(zhí)行任何其他操作。除非調(diào)用 SqlDataReader 的 Close 方法,否則會(huì)一直處于此狀態(tài)。
SqlDataAdapter象一座橋梁,一頭連起數(shù)據(jù)庫(kù)表,一頭連起一個(gè) DataSet 或者 DataTable ,在把數(shù)據(jù)庫(kù)中的數(shù)據(jù)填充到 DataSet 或 DataTable 后就可以“過河拆橋”,不用再連接到數(shù)據(jù)庫(kù),而可以直接從 DataSet 或 DataTable 中獲取數(shù)據(jù)。
SqlDataAdapter提供了許多的方法,來方便我們對(duì)一些特定的數(shù)據(jù)集合進(jìn)行操作比如,填充一個(gè)查詢結(jié)果到 DataTable ,或 DataSet 中其實(shí)就是類似于:創(chuàng)建一個(gè) SqlCommand 然后執(zhí)行 "Select * from [Table]" 然后執(zhí)行 ExcuteReader()方法 得到一個(gè)IDataReader對(duì)象然后逐行讀取數(shù)據(jù)并存放到一個(gè)集合對(duì)象中(如DataTable)經(jīng)過測(cè)試,如果有大量的數(shù)據(jù)操作最好是自己寫 SqlCommand ,會(huì)比SqlDataAdapter操作數(shù)據(jù)庫(kù)快很多
SqlDataReader只能讀取數(shù)據(jù)庫(kù),而且所操作的表必須處于連接狀態(tài),但是要對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫操時(shí),只能借助 SqlCommand 類,SqlDataAdapter 它建立在 SqlCommand 對(duì)象之上,它具有 SqlCommand 類的一切功能,能夠?qū)?shù)據(jù)填充到 DataSet 對(duì)象中,而且不用再連接到數(shù)據(jù)庫(kù),而可以直接從 DataSet 或 DataTable 中獲取數(shù)據(jù)。(因?yàn)樗捎玫臒o連接傳輸模式)
SqlDataReader對(duì)象可以從數(shù)據(jù)庫(kù)中得到只讀的、只能向前的數(shù)據(jù)流,還可以提高應(yīng)用程序的性能,減少系統(tǒng)開銷,同一時(shí)間只有一條行記錄在內(nèi)存中。
SqlDataAdapter對(duì)象可以自動(dòng)打開和自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接(不需人為管理),適配器的主要工作流程:SqlConnection 對(duì)象建立與數(shù)據(jù)源的連接,SqlDataAdapter 對(duì)象經(jīng)由 SqlCommand 對(duì)象返回給SqlDataAdapter,最后將SqlDataAdapter對(duì)象加入到 DataSet 對(duì)象的 DataTables 對(duì)象中。
總結(jié):
性能上:SqlDataReader一次只在內(nèi)存中存儲(chǔ)一行,減少了系統(tǒng)開銷。優(yōu)于SqlDataAdapter。
讀取時(shí):SqlDataReader需通過調(diào)用自身Read()方法循環(huán)讀取數(shù)據(jù)到指定對(duì)象。而SqlDataAdapter可通過調(diào)用Fill()方法一次性填充數(shù)據(jù)到DataSet。還可將對(duì) DataSet 所做的更改解析回?cái)?shù)據(jù)源。
操作上:SqlDataReader需通過調(diào)用自身的Close()方法斷開連接。而SqlDataAdapter可以讀取完數(shù)據(jù)庫(kù)后自動(dòng)斷開連接.
微軟擴(kuò)展閱讀:https://msdn.microsoft.com/zh-cn/zh-ch/library/ms254931.aspx
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注