DataReader的使用總結

2021-04-06 18:36:16 字數 4101 閱讀 5144

對學習.net的人來說ado.net應當是不陌生了,不過我在這裡還是想總結一下關於datareader的使用

datareader包括了兩種形式:sqldatareader和oledbdatareader,其中很多的用法和屬性都是相通的。

首先datareader從資料庫當中檢索唯讀,只進的資料流,它也儲存在客戶端的網路緩衝區當中。且它在記憶體當中只是儲存一行,開銷小,速度快。它返回的只是一條記錄,我們可以通過read方法來讀取使用它。datareader 提供未緩衝的資料流,該資料流使過程邏輯可以有效地按順序處理從資料來源中返回的結果。由於資料不在記憶體中快取,所以在檢索大量資料時,datareader 是一種適合的選擇

其次:datareader只能通過command物件executereader()來建立,不能例項化。

sqldatareaer myreader = mycommand.executereader() //建立datareader

第三:關閉datareader,這一點不同於其它物件。datareader具有獨占性,如果在已經開啟datareader的情況下, 我們將不能對connection進行任何操作,因此必須在用完時關閉它,呼叫 close()方法,當然了 當你在關閉了datareader後我們可以使用它的兩個屬性isclosed,affectedrows,這兩個屬性也只有在datareader關閉了之後才能使用。

第四:多個結果集,我們可以通過command物件返回多個結果集,並且通過datareader物件的nextresult()方法來使用:

下面是來自msdn的例子:

sqlcommand mycmd = new sqlcommand("select categoryid, categoryname from categories;" +

"select employeeid, lastname from employees", nwindconn);

nwindconn.open();

sqldatareader myreader = mycmd.executereader();

do/t", myreader.getname(0), myreader.getname(1));

while (myreader.read())

console.writeline("/t/t", myreader.getint32(0), myreader.getstring(1));

} while (myreader.nextresult());

myreader.close();

nwindconn.close();

第五:用datareader來取得表的架構資訊:getschematable()

當datareader開啟時,我們可以用其getschematable()來返回該結果集的架構資訊。它將返回乙個datatable,這個datatable當中的每一行資訊對就於資料集當中的乙個列的相關屬性資訊。

msdn例子:

datatable schematable = myreader.getschematable();

foreach (datarow myrow in schematable.rows)

上面的例項就是指在取得了乙個資料集的架構資訊後我們將遍歷所有的行及行當中的列,並且輸出列的名稱及其值

第一次看這個例子的時候誤把mycol.columnname看作了列元資料當中的columnname,讓我折騰了半天也沒弄明白輸出結果會那樣,哎,暈。

對於 getschematable 方法,將按以下順序返回關於每個列的元資料:

datareader 列 說明 

columnname 列的名稱;它可能不唯一。如果無法確定該名稱,則返回空值。此名稱始終反映最近對當前檢視或命令文字中的列進行的重新命名。 

columnordinal 列的序號。它對於行的書籤列(如果有的話)為零。其他列從一開始編號。該列不能包含空值。 

columnsize 列中值的最大可能長度。對於採用固定長度資料型別的列,它是該資料型別的大小。 

numericprecision 如果 providertype 是數值資料型別,則它是列的最大精度。精度取決於列的定義。如果 providertype 不是數值資料型別,則它為空值。 

numericscale 如果 providertype 是 dbtype_decimal 或 dbtype_numeric,則為小數點右側的位數。否則,它為空值。 

isunique true:基表(basetablename 返回的表)中的任何兩行在該列中都不能有相同的值。如果此列本身為乙個鍵,或如果有乙個僅應用於該列的 unique 型別約束,那麼 isunique 一定為 true。false:在基表中該列可以包含重複值。該列的預設值為 false。 

iskey true:此列是行集合中合起來可唯一地標識該行的一組列中的一列。iskey 設定為 true 的一組列必須唯一地標識行集合中的乙個行。不要求此列集是最小列集。這組列可以從基表主鍵、唯一約束或唯一索引生成。false:唯一地標識該行時不需要此列。 

baseservername sqldatareader 使用的 microsoft sql server 例項的名稱。 

basecatalogname 包含列的資料儲存區中的目錄的名稱。如果不能確定基目錄名稱,則為 null。該列的預設值為空值。 

basecolumnname 資料儲存區中列的名稱。如果使用別名,它可能不同於在 columnname 列中返回的列名稱。如果無法確定基列名稱,或者如果行集合列從資料儲存區中的列匯出但不等於該列,則為空值。該列的預設值為空值。 

baseschemaname 包含列的資料儲存區中的架構的名稱。如果無法確定基架構名稱,則為空值。該列的預設值為空值。 

basetablename 包含列的資料儲存區中的表或檢視的名稱。如果無法確定基表名稱,則為空值。該列的預設值為空值。 

datatype 對映到列的 .net framework 型別。 

allowdbnull 如果使用者可以將此列設定為空值,或者如果提供者不能確定使用者是否可以將此列設定為空值,則設定該值。否則,不設定該值。即使列無法設定為空值,它仍可能包含空值。 

providertype 列的資料型別的指示符。如果不同行的列資料型別不同,則它必須為 object。該列不能包含空值。 

isaliased 如果列名稱為別名,則為 true;否則為 false。 

i***pression 如果此列為表示式,則為 true;否則為 false。 

isidentity 如果此列為標識列,則為 true;否則為 false。 

isautoincrement true:該列以固定的增量向新行賦值。false:該列不以固定的增量向新行賦值。該列的預設值為 false。 

isrowversion 如果列包含無法寫入的不變的行識別符號,並且除了標識行外沒有其他有意義的值,則設定該值。 

ishidden 如果列是隱藏的,則為 true;否則為 false。 

islong 如果列包含二進位製長物件 (blob)(它包含非常長的資料),則設定該值。非常長的資料的定義針對於提供程式。 

isreadonly 如果不能修改該列,則為 true;否則為 false。 

若要建立 sqldatareader,必須呼叫 sqlcommand 物件的 executereader 方法,而不直接使用建構函式。

當正在使用 sqldatareader 時,關聯的 sqlconnection 在忙於服務 sqldatareader,而且除了關閉以外不能對 sqlconnection 執行其他任何操作。除非呼叫 sqldatareader 的 close 方法,否則會一直處於此狀態。例如,在呼叫 close 之前,無法檢索輸出引數。

在資料讀取過程中由另乙個程序或執行緒對結果集所作的更改可能對於 sqldatareader 的使用者可見。但是,確切的行為與執行時間有關。

當 sqldatareader 關閉後,只能呼叫 isclosed 和 recordsaffected 屬性。儘管可以在 sqldatareader 存在時隨時訪問 recordsaffected 屬性,但始終應該在返回 recordsaffected 的值之前呼叫 close,以確保正確的返回值。

注意   為了獲得最佳效能,sqldatareader 會避免建立不必要的物件或複製不必要的資料。結果,對 getvalue 等方法的多次呼叫將返回對相同物件的引用。如果正在修改由 getvalue 等方法返回的物件的基礎值,請使用警告。

DataReader的使用方法

c 中提供的datareader可以從資料庫中每次提取一條資料。這裡我做了乙個登入驗證的演示,演示從資料庫中讀取符合條件的記錄 datareader 常用屬性 fieldcount 獲取字段數目 isclosed 取得狀態true or fals item 獲取或設定字段內容,name為欄位名,or...

使用DataReader填充DataTable

public function fill function fill byval datareader assqldatareader asdatatable dimdatatable asdatatable dimdatarow asdatarow datatable new datatable ...

使用datareader檢索資料

code sqldatareader reader command.executereader 以下 示例迴圈訪問乙個 datareader 物件,並從每個行中返回兩個列。code if reader.hasrows while reader.read console.writeline t t r...