本範例展示 .NET Framework 1.x 時代的 System.Data.ADO 命名空間用法,屬於早期 ADO.NET 橋接 ADO (ActiveX Data Objects) 的過渡性 API。現代專案請直接使用 System.Data.OleDb (OleDbConnection, OleDbDataAdapter) 或 Entity Framework Core。
using System;
using System.Data;
// 注意:System.Data.ADO 已過時,僅供維護舊專案參考
using System.Data.ADO;
public class AdoNetClassicDemo
{
public static void Main()
{
// 1. 連接字串:Jet OLEDB Provider 針對 .mdb (Access 2003 及以前)
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BugTypes.MDB";
string sql = "SELECT * FROM Categories";
// 2. 建立 DataSet 並預先加入 DataTable(舊版 API 需手動加入)
var dataSet = new DataSet();
dataSet.Tables.Add("Categories");
// 3. 建立 ADO.NET 1.x 特有物件
using (var conn = new ADOConnection(connString))
using (var cmd = new ADODataSetCommand())
{
cmd.SelectCommand = new ADOCommand(sql, conn);
conn.Open();
try
{
// 4. 填充 DataSet
cmd.FillDataSet(dataSet, "Categories");
}
finally
{
conn.Close(); // 確保連線關閉
}
// 5. 遍歷並輸出結果
PrintDataSetInfo(dataSet);
}
}
private static void PrintDataSetInfo(DataSet ds)
{
try
{
// 取得所有 DataTable
DataTable[] tables = ds.Tables.Cast().ToArray(); // 現代寫法
// 舊版:DataTable[] tables = ds.Tables.All; // 已過時屬性
foreach (DataTable dt in tables)
{
Console.WriteLine($"Found data table: {dt.TableName}");
}
Console.WriteLine($"{tables.Length} tables in data set");
// 針對特定表格操作
if (ds.Tables.Contains("Categories"))
{
DataTable catTable = ds.Tables["Categories"];
Console.WriteLine($"{catTable.Rows.Count} rows in Categories table");
Console.WriteLine($"{catTable.Columns.Count} columns in Categories table");
// 列出欄位資訊
foreach (DataColumn col in catTable.Columns)
{
Console.WriteLine($"Column: {col.ColumnName}, Type: {col.DataType}");
}
// 列出資料列
foreach (DataRow row in catTable.Rows)
{
// 假設第 0 欄為 CategoryID,第 1 欄為 CategoryName
Console.WriteLine($"CategoryName[{row[0]}] = {row[1]}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
| 舊版 (System.Data.ADO) | 現代標準 (System.Data.OleDb) | 說明 |
|---|---|---|
ADOConnection | OleDbConnection | 資料庫連線 |
ADOCommand | OleDbCommand | SQL 命令 |
ADODataSetCommand | OleDbDataAdapter | DataSet 填充器 |
FillDataSet(ds, "Table") | adapter.Fill(ds, "Table") | 填充方法 |
ds.Tables.All | ds.Tables.Cast<DataTable>().ToArray() | 取得所有表格 |
dt.Rows.All | dt.Rows.Cast<DataRow>() | 取得所有列 |
dc.Columns.All | dt.Columns.Cast<DataColumn>() | 取得所有欄 |
using System;
using System.Data;
using System.Data.OleDb;
public class ModernOleDbDemo
{
public static void Main()
{
string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=BugTypes.accdb;"; // .accdb 用 ACE Provider
string sql = "SELECT * FROM Categories";
using (var conn = new OleDbConnection(connString))
using (var adapter = new OleDbDataAdapter(sql, conn))
{
var ds = new DataSet();
adapter.Fill(ds, "Categories"); // 自動建立 DataTable
foreach (DataTable dt in ds.Tables)
{
Console.WriteLine($"Table: {dt.TableName}, Rows: {dt.Rows.Count}");
foreach (DataRow row in dt.Rows)
{
Console.WriteLine($" ID={row["CategoryID"]}, Name={row["CategoryName"]}");
}
}
}
}
}
System.Data.ADO 參考,改用 System.Data.OleDb。.mdb 用 Microsoft.Jet.OLEDB.4.0 (32-bit only);.accdb 用 Microsoft.ACE.OLEDB.12.0 (需安裝 Access Database Engine)。ADOConnection/Command/DataSetCommand 替換為 OleDbConnection/Command/DataAdapter。using 區塊確保非託管資源釋放。.All 屬性改為 LINQ Cast<T>() 或直接 foreach 迭代集合。理解舊 API 有助於維護遺留系統,但新開發請毫不猶豫採用現代 ADO.NET 或 ORM 框架。