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在讀取數據時,限制每次只能讀一條,這樣無疑提高了讀取效率,一般適用於返回結果只有一條數據的情況。
如果返回的是多條記錄,就要慎用此對象。
