ADO.NET 2.0 引入 Provider Factory 模式(DbProviderFactories),提供統一介面建立連接、命令、適配器等物件,支援多資料庫切換。但內建不含 MySQL,且 MySQL/SQL Server 的 ParameterMarkerFormat 存在 Bug,需自行擴充。
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() 取得 DbProviderFactoryDbConnection、DbCommand、DbDataAdapter 等通用物件GetParameterMarkerFormat() 動態產生正確佔位符(@p0 或 ?p0)MySql.Data.dll(NuGet: MySql.Data)