ADO.NET存取數據庫
發表于:2007-06-30來源:作者:點擊數:
標簽:
以下是本CSDN社區的Michael_Jackson(麥克爾★杰克遜)的貼子(刪除了C#部分),放這里我想對大家更有用! 可以使用 ADO.NET DataReader 從 數據庫 中檢索只讀、只進的數據流。因為每次在內存中始終只有一行,所以使用 DataReader 可提高應用程序的 性能 并減少
以下是本CSDN社區的Michael_Jackson(麥克爾★杰克遜)的貼子(刪除了C#部分),放這里我想對大家更有用!
可以使用 ADO.NET DataReader 從
數據庫中檢索只讀、只進的數據流。因為每次在內存中始終只有一行,所以使用 DataReader 可提高應用程序的
性能并減少系統開銷。
當創建 Command 對象的實例后,可調用 Command.ExecuteReader 從數據源中檢索行,從而創建一個 DataReader,如以下示例所示。
[Visual Basic]
Dim myReader As SqlDataReader = myCommand.ExecuteReader()
使用 DataReader 對象的 Read 方法可從查詢結果中獲取行。通過向 DataReader 傳遞列的名稱或序號引用,可以訪問返回行的每一列。不過,為了實現最佳性能,DataReader 提供了一系列方法,它們將使您能夠訪問其本機數據類型(GetDateTime、GetDouble、GetGuid、GetInt32 等)形式的列值。有關類型化訪問器方法的列表,請參閱 OleDbDataReader 類和 SqlDataReader 類。如果在基礎數據類型未知時使用類型化訪問器方法,將減少在檢索列值時所需的類型轉換量。
以下代碼示例循環訪問一個 DataReader 對象,并從每個行中返回兩個列。
[Visual Basic]
Do While myReader.Read()
Console.WriteLine(
vbTab & "{0}" & vbTab & "{1}", myReader.GetInt32(0), myReader.GetString(1))
Loop
myReader.Close()
DataReader 提供未緩沖的數據流,該數據流使過程邏輯可以有效地按順序處理從數據源中返回的結果。由于數據不在內存中緩存,所以在檢索大量數據時,DataReader 是一種適合的選擇。
關閉 DataReader
每次使用完 DataReader 對象后都應調用 Close 方法。
如果 Command 包含輸出參數或返回值,那么在 DataReader 關閉之前,將無法訪問這些輸出參數或返回值。
請注意,當 DataReader 打開時,該 DataReader 將以獨占方式使用 Connection。在初始 DataReader 關閉之前,將無法對 Connection 執行任何命令(包括創建另一個 DataReader)。
多個結果集
如果返回的是多個結果集,DataReader 會提供 NextResult 方法來按順序循環訪問這些結果集,如以下代碼示例所示。
[Visual Basic]
Dim myCMD As SqlCommand = New SqlCommand("SELECT CategoryID, CategoryName FROM Categories;" & _
"SELECT EmployeeID, LastName FROM Employees", nwindConn)
nwindConn.Open()
Dim myReader As SqlDataReader = myCMD.ExecuteReader()
Dim fNextResult As Boolean = True
Do Until Not fNextResult
Console.WriteLine(vbTab & myReader.GetName(0) & vbTab & myReader.GetName(1))
Do While myReader.Read()
Console.WriteLine(vbTab & myReader.GetInt32(0) & vbTab & myReader.GetString(1))
Loop
fNextResult = myReader.NextResult()
Loop
myReader.Close()
nwindConn.Close()
從 DataReader 中獲取架構信息
當 DataReader 打開時,可以使用 GetSchemaTable 方法檢索有關當前結果集的架構信息。GetSchemaTable 將返回一個填充了行和列的 DataTable 對象,這些行和列包含當前結果集的架構信息。對于結果集的每一列,DataTable 都將包含一行。架構表行的每一列都映射到在結果集中返回的列的屬性,其中 ColumnName 是屬性的名稱,而列的值為屬性的值。以下代碼示例為 DataReader 寫出架構信息。
[Visual Basic]
Dim schemaTable As DataTable = myReader.GetSchemaTable()
Dim myRow As DataRow
Dim myCol As DataColumn
For Each myRow In schemaTable.Rows
For Each myCol In schemaTable.Columns
Console.WriteLine(myCol.ColumnName & " = " & myRow(myCol).ToString())
Next
Console.WriteLine()
Next
OLE DB 章節
分層行集或章節(OLE DB 類型 DBTYPE_HCHAPTER、ADO 類型 adChapter)可以使用 OleDbDataReader 來檢索。當以 DataReader 的形式返回包含某章節的查詢時,該章節將以此 DataReader 中列的形式返回,并公開為 DataReader 對象。
ADO.NET DataSet 也可用于通過表間的父子關系來表示分層行集。有關的更多信息,請參閱創建和使用 DataSet。
以下代碼示例使用 MSDataShape 提供程序來為客戶列表中的每個客戶生成訂單的章節列。
[Visual Basic]
Dim nwindConn As OleDbConnection = New OleDbConnection("Provider=MSDataShape;Data Provider=
SQLOLEDB;" & _
"Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")
Dim custCMD As OleDbCommand = New OleDbCommand("SHAPE {SELECT CustomerID, CompanyName FROM Customers} " & _
" APPEND ({SELECT CustomerID, OrderID FROM Orders} AS CustomerOrders " & _
" RELATE CustomerID TO CustomerID)", nwindConn)
nwindConn.Open()
Dim custReader As OleDbDataReader = custCMD.ExecuteReader()
Dim orderReader As OleDbDataReader
Do While custReader.Read()
Console.WriteLine("Orders for " & custReader.GetString(1)) @# custReader.GetString(1) = CompanyName
orderReader = custReader.GetValue(2) @# custReader.GetValue(2) = Orders chapter as DataReader
Do While orderReader.Read()
Console.WriteLine(vbTab & orderReader.GetInt32(1)) @# orderReader.GetInt32(1) = OrderID
Loop
orderReader.Close()
Loop
custReader.Close()
nwindConn.Close()
原文轉自:http://www.kjueaiud.com