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

ASP.NET 2.0 Access 資料存取類(OleDb 版)完整實作

     編輯:關於C語言

設計目標

提供一個輕量、可重複使用的靜態類別,封裝 OleDbConnection、OleDbCommand、OleDbDataAdapter 等 ADO.NET 物件,支援 ExecuteNonQuery、DataReader、DataSet、DataTable、DataView 五種常見資料操作模式,連線字串從 Web.config 讀取。

Web.config 設定

<appSettings>
  <add key="myconn" value="|DataDirectory|\App_Data\MyDB.mdb" />
</appSettings>

完整類別程式碼

using System;
using System.Data;
using System.Data.OleDb;
using System.Configuration;

public static class AccessHelper
{
    private static readonly string ConnStr = 
        @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
        System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["myconn"]);

    // 內部開啟/關閉連線
    private static OleDbConnection GetOpenConnection()
    {
        var conn = new OleDbConnection(ConnStr);
        if (conn.State == ConnectionState.Closed) conn.Open();
        return conn;
    }

    // 1. 執行非查詢 SQL (INSERT/UPDATE/DELETE)
    public static int ExecuteNonQuery(string sql, params OleDbParameter[] parameters)
    {
        using (var conn = GetOpenConnection())
        using (var cmd = new OleDbCommand(sql, conn))
        {
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            return cmd.ExecuteNonQuery();
        }
    }

    // 2. 回傳 DataReader (呼叫端需自行關閉)
    public static OleDbDataReader ExecuteReader(string sql, params OleDbParameter[] parameters)
    {
        var conn = GetOpenConnection();
        var cmd = new OleDbCommand(sql, conn);
        if (parameters != null) cmd.Parameters.AddRange(parameters);
        // CommandBehavior.CloseConnection: 關閉 Reader 時自動關閉連線
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }

    // 3. 回傳 DataSet (離線資料集)
    public static DataSet GetDataSet(string sql, params OleDbParameter[] parameters)
    {
        using (var conn = GetOpenConnection())
        using (var da = new OleDbDataAdapter(sql, conn))
        {
            if (parameters != null) da.SelectCommand.Parameters.AddRange(parameters);
            var ds = new DataSet();
            da.Fill(ds);
            return ds;
        }
    }

    // 4. 回傳 DataTable (單一資料表)
    public static DataTable GetDataTable(string sql, params OleDbParameter[] parameters)
    {
        using (var conn = GetOpenConnection())
        using (var da = new OleDbDataAdapter(sql, conn))
        {
            if (parameters != null) da.SelectCommand.Parameters.AddRange(parameters);
            var dt = new DataTable();
            da.Fill(dt);
            return dt;
        }
    }

    // 5. 回傳 DataView (可排序/篩選的檢視)
    public static DataView GetDataView(string sql, params OleDbParameter[] parameters)
    {
        return GetDataSet(sql, parameters).Tables[0].DefaultView;
    }
}

使用範例

// 參數化查詢防止 SQL Injection
string sql = "SELECT * FROM Users WHERE Age > ? AND City = ?";
var dt = AccessHelper.GetDataTable(sql, 
    new OleDbParameter("Age", 18), 
    new OleDbParameter("City", "Taipei"));

foreach (DataRow row in dt.Rows)
    Console.WriteLine($"{row["Name"]} - {row["Email"]}");

改進重點(相較原始碼)

  • 移除靜態共用連線/命令物件:原碼使用 static OleDbConnection/Command 會導致多執行緒衝突與連線洩漏,改為 using 區塊確保釋放。
  • 支援參數化查詢:新增 params OleDbParameter[],杜絕字串拼接 SQL Injection 風險。
  • 簡化 API:移除 ref 多載,統一回傳值,符合現代 C# 慣例。
  • 連線字串快取:靜態建構子一次讀取 Web.config,避免重複 I/O。

適用範圍

ASP.NET 2.0~4.8、.NET Framework 專案。.NET Core / 5+ 建議改用 Microsoft.Data.OleDb NuGet 套件,命名空間相同,用法不變。

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