標籤:style blog io color ar os 使用 sp strong
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在讀取資料時,限制每次只能讀一條,這樣無疑提高了讀取效率,一般適用於返回結果只有一條資料的情況。
如果返回的是多條記錄,就要慎用此對象。
C#與資料庫訪問技術總結(十三)之DataReader對象