本文透過應用程式精靈產生的標準 Managed C++ 專案範例,示範使用 ADO.NET 的 DataReader 類別從資料庫擷取唯讀、前進式資料流。因資料在記憶體中一次僅佔一列,DataReader 能提升應用程式效能並降低系統負擔。
#using <mscorlib.dll>
#using <system.dll>
#using <system.data.dll>
using namespace System;
using namespace System::Data::ADO; // 注意:實際為 System::Data::OleDb 或 SqlClient
ADOConnection,設定 ConnectionString 指定資料來源 (範例使用 Jet OLEDB 4.0 存取 Access .mdb),呼叫 Open()。ADOCommand 封裝 SQL 查詢 (SELECT ProductName, UnitPrice FROM Products),執行 Execute() 取得 ADODataReader 參考。Read() 逐列前進,透過索引或欄位名稱存取 Item 集合取得資料。注意:存取資料前必須先呼叫 Read()。DataReader、Connection,並在例外處理中確保資源釋放。int main(void) {
ADOConnection* connection;
ADOCommand* command;
ADODataReader* dataReader;
try {
connection = new ADOConnection();
connection->ConnectionString = S"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\Data\\grocertogo.mdb;Persist Security Info=False";
connection->Open();
command = new ADOCommand(S"SELECT ProductName, UnitPrice FROM Products", connection);
command->Execute(&dataReader);
Console::WriteLine(S"_____________________________________");
Console::WriteLine(S"Product | Price");
Console::WriteLine(S"_____________________________________");
while (dataReader->Read()) {
Console::WriteLine(S"{0, -30}| {1}",
dataReader->get_Item("ProductName"),
dataReader->get_Item("UnitPrice"));
}
Console::WriteLine(S"_____________________________________");
dataReader->Close();
connection->Close();
}
catch (Exception* e) {
Console::WriteLine("Error occured: {0}", e->Message);
if (dataReader && !dataReader->IsClosed) dataReader->Close();
if (connection->State == DBObjectState::Open) connection->Close();
}
Console::WriteLine("Press ENTER to continue");
Console::ReadLine();
return 0;
}
DataReader 提供高效能、低記憶體占用的資料讀取方式,適合大量資料串流處理。SqlConnection、SqlCommand、SqlDataReader 等類別)。