C#與數據庫訪問技術總結(十三)之DataReader對象


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

如果返回的是多條記錄,就要慎用此對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM