標籤:style blog io color ar os 使用 for sp
資料閱讀器
當執行返回結果集的命令時,需要一個方法從結果集中提取資料。
處理結果集的方法有兩個:
第一,使用資料閱讀器(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。在這種情況下,仍返回多個結果集,但每個結果集只有一行。 |
C#與資料庫訪問技術總結(十一)之資料閱讀器(DataReader)1