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

C# 資料庫存取工廠模式:DbProviderFactory 實現多資料庫無縫切換

     編輯:關於C#

問題背景

專案需支援多種資料庫,不想在程式碼中寫死 SqlConnection/OleDbConnection 等具體類別。.NET 內建 DbProviderFactory 抽象工廠,配合設定檔即可實現「只改設定、不改代碼」的資料庫切換。

設定檔範例

<connectionStrings>
  <add name="SqlConn" connectionString="server=.;uid=sa;pwd=123;db=Test" providerName="System.Data.SqlClient" />
  <add name="OleDbConn" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb" providerName="System.Data.OleDb" />
</connectionStrings>

通用資料存取類

using System;
using System.Data;
using System.Data.Common;
using System.Configuration;

class DataBaseFac
{
    private DbConnection cnn;
    private DbCommand cmd;
    private DbProviderFactory provider;

    public DataBaseFac(string connName = "SqlConn")
    {
        // 1. 取得 ProviderName
        string providerName = ConfigurationManager.ConnectionStrings[connName].ProviderName;

        // 2. 取得對應工廠
        provider = DbProviderFactories.GetFactory(providerName);

        // 3. 建立連線、命令物件
        cnn = provider.CreateConnection();
        cnn.ConnectionString = ConfigurationManager.ConnectionStrings[connName].ConnectionString;
        cmd = provider.CreateCommand();
        cmd.Connection = cnn;
    }

    // 執行查詢回傳 DataTable
    public DataTable ExecuteQuery(string sql)
    {
        DataTable dt = new DataTable();
        DbDataAdapter adapter = provider.CreateDataAdapter();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = sql;
        adapter.SelectCommand = cmd;

        try
        {
            cnn.Open();
            adapter.Fill(dt);
        }
        catch { dt = null; }
        finally { cnn.Close(); }

        return dt;
    }

    // 執行非查詢
    public int ExecuteNonQuery(string sql)
    {
        cmd.CommandText = sql;
        try
        {
            cnn.Open();
            return cmd.ExecuteNonQuery();
        }
        finally { cnn.Close(); }
    }
}

核心優勢

  • 零硬編碼:新增資料庫類型只需安裝對應 ADO.NET Provider 並修改 providerName。
  • 統一介面:所有操作針對 DbConnection, DbCommand, DbDataAdapter 抽象基類。
  • 擴充性:支援 Oracle (System.Data.OracleClient / ODP.NET)、PostgreSQL (Npgsql)、MySQL (MySql.Data) 等。

進階封裝建議

  1. 加入參數化查詢支援:cmd.Parameters.Add(provider.CreateParameter())。
  2. 實作 ExecuteScalar, ExecuteReader 等常用方法。
  3. 整合連線池、交易管理(DbTransaction)。
  4. 搭配 appSettings 或自訂 ConfigurationSection 管理多連線字串。

常見誤區

有人用 switch(providerName) new 具體 Connection/Command,自稱「工廠模式」。這違背工廠模式初衷——工廠模式正是為了消除 switch/case。正確做法正是 DbProviderFactories.GetFactory()。

結語

DbProviderFactory 是 .NET 早期內建的抽象工廠典範。雖然現代 ORM (EF Core, Dapper) 已大幅簡化資料存取,但理解此機制有助於維護舊系統、撰寫跨資料庫工具或實作輕量級 Micro-ORM。

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