配置中的连接字符串设置有一个provider 属性。如果在本地配置了正确的提供程序,您可以按如下方式使用它:
[System.Configuration.ConfigurationProperty("providerName", DefaultValue=Mono.Cecil.CustomAttributeArgument)] 公共字符串 ProviderName { get; 放; }
<connectionStrings>
<add name="Example"
providerName="System.Data.SqlClient"
connectionString="Data Source=1.1.1.1;Integrated Security=True"/>
</connectionStrings>
可以这样调用:
DbProviderFactories.GetFactory(settings.ProviderName);
通常,如果您只有一个 DBConnection,您可以创建一个辅助方法来检索 ProviderFactory:
public static DbProviderFactory GetProviderFactory(DbConnection connection)
{
DbProviderFactory providerFactory = null;
Type connectionType = connection.GetType();
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
// Check for DbConnection.DbProviderFactory
PropertyInfo providerFactoryInfo = connectionType.GetProperty("DbProviderFactory", flags);
if (providerFactoryInfo != null)
providerFactory = (DbProviderFactory)providerFactoryInfo.GetValue(connection, null);
// Check for DbConnection.ConnectionFactory.ProviderFactory
if (providerFactory == null)
{
PropertyInfo connectionFactoryInfo = connectionType.GetProperty("ConnectionFactory", flags);
object connectionFactory = connectionFactoryInfo.GetValue(connection, null);
providerFactoryInfo = connectionFactory.GetType().GetProperty("ProviderFactory", flags);
providerFactory = (DbProviderFactory)providerFactoryInfo.GetValue(connectionFactory, null);
}
// No match
if (providerFactory == null)
throw new InvalidOperationException("ProviderFactory not found for connection");
return providerFactory;
}
但是 .NET 核心不包括反射,所以这不能开箱即用。