資料閱讀器
當執行返回結果集的命令時,需要一個方法從結果集中提取資料。
處理結果集的方法有兩個:
第一,使用資料閱讀器(DataReader):
第二,同時使用資料介面卡(Data Adapter)和ADO.NET資料集(DataSet)。
本節將學習資料閱讀器的有關知識。
DataReader類
在ADO.NET中由每個資料提供程式實現自己的DataReader。
資料讀取器(DataReader)是從一個資料來源中選擇某些資料的最簡單的方法,但也是功能較弱的一個方法。
DataReader類沒有建構函式,所以不能直接例項化它,需要從Command物件中返回一個DataReader例項,具體做法是通過呼叫它們的ExecuteReader方法。
1. 建立DataReader物件
在ADO.NET中從來不會顯式地使用DataReader物件的建構函式建立DataReader物件。
事實上,DataReader類沒有提供公有的建構函式。
人們通常呼叫Command類的ExecuteReader方法,這個方法將返回一個DataReader物件。
下面的程式碼闡明瞭如何建立SqlDataReader物件:
下面程式碼的功能是從表student中讀取資料,並將資料列學號和姓名的所有資料輸出到控制檯:
String cnstr="server=(local); database=Student; Integrated Security=true"; SqlConnection cn=new SqlConnection(cnstr); cn.Open(); string sqlstr=" select * from student"; SqlCommand cmd=new SqlCommand(sqlstr, cn); SqlDataReader dr=cmd.ExecuteReader( ); while(dr.Read()) { String id=dr["學號"].ToString(); String name=dr["姓名"].ToString(); Console.WriteLine("學號:{0} 姓名:{1}", id, name); } dr.Close(); cn.Close();
DataReader類最常見的用法就是檢索SQL查詢或儲存過程返回記錄。
另外DataReader 是一個連線的、只向前的和只讀的結果集。
也就是說,當使用資料閱讀器時,必須保持連線處於開啟狀態。
除此之外,可以從頭到尾遍歷記錄集,而且也只能以這樣的次序遍歷,即只能沿著一個方向向前的方式遍歷所有的記錄,並且在此過程中資料庫連線要一直保持開啟狀態,否則將不能通過DataReader讀取資料。
這就意味著,不能在某條記錄處停下來向回移動。
記錄是隻讀的,因此資料閱讀器類不提供任何修改資料庫記錄的方法。
注意:
資料閱讀器使用底層的連線,連線是它專有的。
當資料閱讀器開啟時,不能使用對應的連線物件執行其他任何任務,例如執行另外的命令等。
當閱讀完資料閱讀器的記錄或不再需要資料閱讀器時,應該立刻關閉資料閱讀器。
在完成資料讀取後,需要呼叫Close()方法關閉DataReader物件。
如果建立DataReader物件時,使用的是ExecuteReader方法的另一個過載,程式碼如下:
SqlDataReader myDataReader=cmd.ExecuteReader(CommandBehavior.CloseConnection);
則關閉DataReader物件時會自動關閉底層連線,不再需要顯示呼叫Connection物件的Close()方法關閉它。
Command物件的Execute方法有一個過載版本,那個過載版本接受命令列為引數。
雖然命令文字指定返回結果集的查詢,但是通過執行命令列為,可以提供一些關於想要怎麼樣使用結果的指令。
ADO.NET在System.Dara名稱空間中定義了CommandBehavior列舉,其值和具體意義如表所示。
成員名稱 |
說明 |
CloseConnection |
在執行該命令時,如果關閉關聯的DataReader物件,則關聯的Connection物件也將關閉 |
Default |
此查詢可能返回多個結果集。 執行查詢可能會影響資料庫狀態。 Default不設定CommandBehavior標誌,因此呼叫ExecuteReader(CommandBehavior.Default)在功能上等效於呼叫ExecuteReader() |
KeyInfo |
此查詢返回列和主鍵資訊。 執行此查詢時不鎖定選定的行。 注意:當使用KeyInfo時,用於SQL Server的.NET Framework資料提供程式將FOR BROWSE子句追加到正在執行的語句。 使用者應該注意潛在的副作用,例如對SET FMTONLY ON語句的使用產生的干擾 |
SchemaOnly |
此查詢只返回列資訊,而不影響資料庫狀態 |
SequentialAccess |
提供一種方法,以便DataReader處理包含帶有二進位制值的列的行。 SequentialAccess不是載入整行,而是使DataReader將資料作為流來載入。 然後可以使用GetBytes或GetChars方法來指定開始讀取操作的位元組位置以及正在返回的資料的有限的緩衝區大小。 當指定SequentialAccess時,儘管無需讀取每個列,但是需要按照列的返回順序讀取它們。 一旦已經讀過返回的資料流中某個位置的內容,就不能再從DataReader中讀取該位置或該位置之前的資料。 當使用OleDbDataReader時,可重新讀取當前列的值,直到讀過它。當使用SqlDataReader時,一次只能讀取一個列值 |
SingleResult |
查詢返回一個結果集 |
SingleRow |
查詢應返回一行。 執行查詢可能會影響資料庫狀態。 一些.NET Framework資料 提供程式可能(但不要求)使用此資訊來優化命令的效能。 在用OleDbCommand物件的ExecuteReader方法指定SingleRow時,用於OLEDB的.NET Framework資料提供程式使用OLE DB IRow介面(如果可用)執行繫結。否則,它使用,IRowset介面。 如果您的SQL語句應該只返回一行,則指定SingleRow還可以提高應用程式效能。 在執行返回多個結果集的查詢時,可以指定SingleRow。在這種情況下,仍返回多個結果集,但每個結果集只有一行。 |