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

ADO.NET 通用介面 DbProviderFactory 擴充支援 MySQL 實戰

     編輯:更多程式設計知識

ADO.NET 2.0 引入 Provider Factory 模式(DbProviderFactories),提供統一介面建立連接、命令、適配器等物件,支援多資料庫切換。但內建不含 MySQL,且 MySQL/SQL Server 的 ParameterMarkerFormat 存在 Bug,需自行擴充。

核心擴充類別:DbProviderFactoriesEx

public static class DbProviderFactoriesEx
{
    // 擴充支援 MySQL 的 Factory 取得
    public static DbProviderFactory GetFactory(string providerName)
    {
        if (providerName == null) throw new ArgumentNullException(nameof(providerName));
        
        switch (providerName)
        {
            case "MySql.Data.MySqlClient":
                return new MySqlClientFactory(); // 需引用 MySql.Data
            default:
                return DbProviderFactories.GetFactory(providerName);
        }
    }

    // 修正 ParameterMarkerFormat Bug
    public static string GetParameterMarkerFormat(DbConnection conn)
    {
        if (conn == null) throw new ArgumentNullException(nameof(conn));
        
        Type t = conn.GetType();
        if (t == typeof(MySql.Data.MySqlClient.MySqlConnection))
            return "?{0}";        // MySQL 使用 ? 佔位符
        if (t == typeof(System.Data.SqlClient.SqlConnection))
            return "@{0}";        // SQL Server 使用 @ 佔位符
        
        // 通用回退:查詢架構資訊
        conn.Open();
        string fmt = conn.GetSchema("DataSourceInformation").Rows[0]["ParameterMarkerFormat"].ToString();
        conn.Close();
        return fmt;
    }
}

應用場景:統一資料存取封裝

  • 配置檔指定 providerName 與連接字串
  • 透過 DbProviderFactoriesEx.GetFactory() 取得 DbProviderFactory
  • 工廠建立 DbConnection、DbCommand、DbDataAdapter 等通用物件
  • 參數化查詢時呼叫 GetParameterMarkerFormat() 動態產生正確佔位符(@p0 或 ?p0)

關鍵優勢

  1. 編譯期解耦:業務代碼零依賴具體 ADO.NET 實作
  2. 運行期切換:修改配置即可在 SQL Server ↔ MySQL 間無縫遷移
  3. 修正已知 Bug:解決 .NET Framework 內建 MySQL/SQL Server 參數標記格式錯誤
  4. 強類型 DataSet 基礎:通用介面可繼承建立強類型 DataSet,享受設計期檢查與 IntelliSense

注意事項

  • 需專案引用 MySql.Data.dll(NuGet: MySql.Data)
  • 複雜查詢(分頁、鎖定提示等)仍有資料庫差異,建議配合標準 SQL 或存儲程序
  • 交易處理、連接池等特性由具體 Provider 實現,行為可能略有差異
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved