首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

ADO.NET 經典入門:使用 ADODataSetCommand 存取 Access 資料庫

     編輯:關於C語言

歷史背景

本範例展示 .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}");
        }
    }
}

關鍵類別對照表(舊 vs 新)

舊版 (System.Data.ADO)現代標準 (System.Data.OleDb)說明
ADOConnectionOleDbConnection資料庫連線
ADOCommandOleDbCommandSQL 命令
ADODataSetCommandOleDbDataAdapterDataSet 填充器
FillDataSet(ds, "Table")adapter.Fill(ds, "Table")填充方法
ds.Tables.Allds.Tables.Cast<DataTable>().ToArray()取得所有表格
dt.Rows.Alldt.Rows.Cast<DataRow>()取得所有列
dc.Columns.Alldt.Columns.Cast<DataColumn>()取得所有欄

現代化改寫範例 (OleDb + using 區塊)

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"]}");
                }
            }
        }
    }
}

遷移檢查清單

  1. 移除 System.Data.ADO 參考,改用 System.Data.OleDb。
  2. 連接字串:.mdb 用 Microsoft.Jet.OLEDB.4.0 (32-bit only);.accdb 用 Microsoft.ACE.OLEDB.12.0 (需安裝 Access Database Engine)。
  3. 將 ADOConnection/Command/DataSetCommand 替換為 OleDbConnection/Command/DataAdapter。
  4. 使用 using 區塊確保非託管資源釋放。
  5. 將 .All 屬性改為 LINQ Cast<T>() 或直接 foreach 迭代集合。

理解舊 API 有助於維護遺留系統,但新開發請毫不猶豫採用現代 ADO.NET 或 ORM 框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved