寶典之使用ADO.NET DataReader檢索數(shù)據(jù)
ADO.NET經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶(hù)都很了解ADO.NET了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。使用ADO.NET DataReader檢索數(shù)據(jù)包括創(chuàng)建Command對(duì)象的實(shí)例,然后通過(guò)調(diào)用Command.ExecuteReader創(chuàng)建一個(gè)DataReader,以便從數(shù)據(jù)源檢索行。下面的示例演示如何使用ADO.NET DataReader檢索數(shù)據(jù),其中reader表示有效的DataReader,而command表示有效的Command對(duì)象。
- reader=command.ExecuteReader();
#T#使用DataReader對(duì)象的Read方法可從查詢(xún)結(jié)果中獲取行。通過(guò)向DataReader傳遞列的名稱(chēng)或序號(hào)引用,可以訪(fǎng)問(wèn)返回行的每一列。不過(guò),為了實(shí)現(xiàn)***性能,DataReader提供了一系列方法,將使您能夠訪(fǎng)問(wèn)其本機(jī)數(shù)據(jù)類(lèi)型(GetDateTime、GetDouble、GetGuid、GetInt32等)的列值。有關(guān)數(shù)據(jù)提供程序特定的DataReaders的類(lèi)型化訪(fǎng)問(wèn)器方法列表,請(qǐng)參見(jiàn)OleDbDataReader和SqlDataReader。假定基礎(chǔ)數(shù)據(jù)類(lèi)型為已知,如果使用類(lèi)型化訪(fǎng)問(wèn)器方法,將減少在檢索列值時(shí)所需的類(lèi)型轉(zhuǎn)換量。
.NETFramework的WindowsServer2003版包含DataReader的附加屬性HasRows,該屬性使您能夠在讀取DataReader之前就可確定它是否返回了任何結(jié)果。以下代碼示例循環(huán)訪(fǎng)問(wèn)一個(gè)DataReader對(duì)象,并從每個(gè)行中返回兩個(gè)列。
- 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提供未緩沖的數(shù)據(jù)流,該數(shù)據(jù)流使過(guò)程邏輯可以有效地按順序處理從數(shù)據(jù)源中返回的結(jié)果。由于數(shù)據(jù)不在內(nèi)存中緩存,所以在A(yíng)DO.NET DataReader檢索數(shù)據(jù)過(guò)大時(shí),DataReader是一種適合的選擇。關(guān)閉DataReader。每次使用完DataReader對(duì)象后都應(yīng)調(diào)用Close方法。如果Command包含輸出參數(shù)或返回值,那么在DataReader關(guān)閉之前,將無(wú)法訪(fǎng)問(wèn)這些輸出參數(shù)或返回值。
請(qǐng)注意,當(dāng)DataReader打開(kāi)時(shí),該DataReader將以獨(dú)占方式使用Connection。在原始DataReader關(guān)閉之前,將無(wú)法對(duì)Connection執(zhí)行任何命令(包括創(chuàng)建另一個(gè)DataReader)。不要在類(lèi)的Finalize方法中對(duì)Connection、DataReader或任何其他托管對(duì)象調(diào)用Close或Dispose。在終結(jié)器中,僅釋放類(lèi)直接擁有的非托管資源。如果類(lèi)不擁有任何非托管資源,則不要在類(lèi)定義中包含F(xiàn)inalize方法。