DataReader物件與資料獲取
DataReader物件以“基於連線”的方式來訪問資料庫。
也就是說,在訪問資料庫、執行SQL操作時,DataReader要求一直連在資料庫上。
這將會給資料庫的連線負載帶來一定的壓力,但DataReader物件的工作方式將在很大程度上減輕這種壓力。(感覺這不是前後矛盾了?)
DataReader物件的常用屬性
DataReader物件提供了用順序的、只讀的方式讀取用Command物件獲得的資料結果集。
由於DataReader只執行讀操作,並且每次只在記憶體緩衝區裡儲存結果集中的一條資料,所以使用DataReader物件的效率比較高,如果要查詢大量資料,同時不需要隨機訪問和修改資料,DataReader是優先的選擇。
DataReader物件有以下常用屬性。
FieldCount屬性:該屬性用來表示由DataReader得到的一行資料中的欄位數。
HasRows屬性:該屬性用來表示DataReader是否包含資料。
IsClosed屬性:該屬性用來表示DataReader物件是否關閉。
DataReader物件的常用方法
同樣,在SQL Server Data Provider裡的DataReader物件叫SqlDataReader,而在OLE DB Data Provider裡叫OleDbDataReader。
DataReader物件使用指標的方式來管理所連線的結果集,它的常用方法有關閉方法、讀取記錄集下一條記錄和讀取下一個記錄集的方法、讀取記錄集中欄位和記錄的方法,以及判斷記錄集是為空的方法。
1.Close方法
Close方法不帶引數,無返回值,用來關閉DataReader物件。
由於DataReader在執行SQL命令時一直要保持同資料庫的連線,所以在DataReader物件開啟的狀態下,該物件所對應的Connection連線物件不能用來執行其他的操作。
所以,在使用完DataReader物件時,一定要使用Close方法關閉該DataReader物件,否則不僅會影響到資料庫連線的效率,更會阻止其他物件使用Connection連線物件來訪問資料庫。
2.bool Read()方法
bool Read()方法會讓記錄指標指向本結果集中的下一條記錄,返回值是true或false。
當Command的ExecuteReader方法返回DataReader物件後,須用Read方法來獲得第一條記錄;
當讀好一條記錄想獲得下一下記錄時,也可以用Read方法。
如果當前記錄已經是最後一條,呼叫Read方法將返回false。
也就是說,只要該方法返回true,則可以訪問當前記錄所包含的欄位。
3.bool NextResult()方法
bool NextResult()方法會讓記錄指標指向下一個結果集。
當呼叫該方法獲得下一個結果集後,依然要用Read方法來開始訪問該結果集。
4.Object GetValue(int i)方法
ObjectGetValue(int i)方法根據傳入的列的索引值,返回當前記錄行裡指定列的值。
由於事先無法預知返回列的資料型別,所以該方法使用Object型別來接收返回資料。
5.int GetValues(Object[] values)方法
int GetValues(Object[] values)方法會把當前記錄行裡所有的資料(一條記錄)儲存到一個陣列裡並返回。
可以使用FieldCount屬性來獲知記錄裡欄位的總數,據此定義接收返回值的陣列長度。
6.獲得指定宇段的方法
獲得指定欄位的方法有GetString、GetChar、GetInt32等,這些方法都帶有一個表示列索引的引數,返回均是Object型別。
使用者可以根據欄位的型別,通過輸入列索引,分別呼叫上述方法,獲得指定列的值。
例如,在資料庫裡,id的列索引是0,通過
string id=GetString(0);
程式碼可以獲得id的值。
7.返回列的資料型別和列名的方法
可以呼叫GetDataTypeName()方法,通過輸入列索引,獲得該列的型別。
這個方法的定義是:
string GetDataTypeName( int i)
可以呼叫GetName()方法,通過輸入列索引,獲得該列的名稱。
這個方法的定義是:
string GetName(int i);
綜合使用上述兩方法,可以獲得資料表裡列名和列的欄位。
8.bool IsDBNull(int i)方法:
bool IsDBNull(int i)方法的引數用來指定列的索引號,該方法用來判斷指定索引號的列的值是否為空,返回Tree或False。
DataReader物件訪問資料庫程式碼示例
下面的程式碼將說明如何利用DataReader物件獲得並訪問結果集。
//連線字串 private static string strConnect=" data source=localhost;uid=sa;pwd=aspent;database=LOGINDB" SqlConnetion objConnection =new SqlConnection(strConnect); SqlCommand objCommand =new SqlCommand( " ",objConnection); // 設定查詢類的SQL語句 objCommand.CommandText= " SELECT *FROM USERS "; try { //開啟資料庫連線 if( objConnection.State == ConnectionState. Closed ) { objConnection.Open(); } //獲取執行結果 SqlDataReader result=objCommand.ExecuteReader(); //如果DataRead物件成功獲得資料,返回true,否則返回false If(result.Read()==true) { //輸出結果集中的各個欄位 Response.Write(result["USERID"].ToString()); Response.Write(result["NICKNAME"].ToString()); Response.Write(result["USERROLE"].ToString()); } } catch(SqlException e) { Response.Write(e.Message.ToString()); } finally { //關閉資料庫連線 if(objConnection.State == ConnectionState.Open) { objConnection.Close(); } //關閉DataRead物件 if(result.IsClosed == false) { reuslt.Close(); } }
DataReader提供未緩衝的資料流,該資料流使過程邏輯可以有效地按順序處理從資料來源中返回的結果。
由於資料不在記憶體中快取,所以在檢索大量資料時,DataReader是一種適合的選擇。
另外值得注意的是,DataReader在讀取資料時,限制每次只能讀一條,這樣無疑提高了讀取效率,一般適用於返回結果只有一條資料的情況。
如果返回的是多條記錄,就要慎用此物件。