寶典之使用ADO.NET DataReader檢索數據
ADO.NET經過長時間的發展,很多用戶都很了解ADO.NET了,這里我發表一下個人理解,和大家討論討論。使用ADO.NET DataReader檢索數據包括創建Command對象的實例,然后通過調用Command.ExecuteReader創建一個DataReader,以便從數據源檢索行。下面的示例演示如何使用ADO.NET DataReader檢索數據,其中reader表示有效的DataReader,而command表示有效的Command對象。
- reader=command.ExecuteReader();
#T#使用DataReader對象的Read方法可從查詢結果中獲取行。通過向DataReader傳遞列的名稱或序號引用,可以訪問返回行的每一列。不過,為了實現***性能,DataReader提供了一系列方法,將使您能夠訪問其本機數據類型(GetDateTime、GetDouble、GetGuid、GetInt32等)的列值。有關數據提供程序特定的DataReaders的類型化訪問器方法列表,請參見OleDbDataReader和SqlDataReader。假定基礎數據類型為已知,如果使用類型化訪問器方法,將減少在檢索列值時所需的類型轉換量。
.NETFramework的WindowsServer2003版包含DataReader的附加屬性HasRows,該屬性使您能夠在讀取DataReader之前就可確定它是否返回了任何結果。以下代碼示例循環訪問一個DataReader對象,并從每個行中返回兩個列。
- PrivateSubHasRows(ByValconnectionAsSqlConnection)
- Usingconnection
- DimcommandAsSqlCommand=NewSqlCommand(_
- "SELECTCategoryID,CategoryNameFROMCategories;",_
- connection)
- connection.Open()
- DimreaderAsSqlDataReader=command.ExecuteReader()
- Ifreader.HasRowsThen
- DoWhilereader.Read()
- Console.WriteLine(reader.GetInt32(0)_
- &vbTab&reader.GetString(1))
- Loop
- Else
- Console.WriteLine("Norowsfound.")
- EndIf
- reader.Close()
- EndUsing
- EndSub
DataReader提供未緩沖的數據流,該數據流使過程邏輯可以有效地按順序處理從數據源中返回的結果。由于數據不在內存中緩存,所以在ADO.NET DataReader檢索數據過大時,DataReader是一種適合的選擇。關閉DataReader。每次使用完DataReader對象后都應調用Close方法。如果Command包含輸出參數或返回值,那么在DataReader關閉之前,將無法訪問這些輸出參數或返回值。
請注意,當DataReader打開時,該DataReader將以獨占方式使用Connection。在原始DataReader關閉之前,將無法對Connection執行任何命令(包括創建另一個DataReader)。不要在類的Finalize方法中對Connection、DataReader或任何其他托管對象調用Close或Dispose。在終結器中,僅釋放類直接擁有的非托管資源。如果類不擁有任何非托管資源,則不要在類定義中包含Finalize方法。