如何控制哪个 SQL 提供程序用于数据库连接?

How can I control which SQL provider is used for a database connection?

在最近的评论中,有人告诉我:

the default SQL Server client used to be System.Data.SqlClient, but more recently there's also Microsoft.Data.SqlClient - same thing conceptually, but packaged slightly differently and more up to date. It is largely up to you whether to use System.Data.SqlClient or Microsoft.Data.SqlClient

同样,我最近尝试使用 DSN 连接字符串 "DSN=MyDSNName" 但失败了,因为我需要使用 ODBC 驱动程序,而不是 SqlServer - DSN 不是 属性在 SqlConnectionStringBuilder.

我的印象是 .NET 会根据我的连接字符串自动选择正确的驱动程序,但似乎不是。

我如何控制这种东西? .Net 能否从我的连接字符串中自动检测要使用的正确提供程序,或者我是否必须在 C# 中进行硬编码,例如我是否想使用 Odbc 与 SqlServer?

即使您已经在 webconfig 或 appsettings 中更新了 Odbc 和 Sql 服务器的连接字符串,如果您需要在代码中使用它,您将需要在 C# 代码中调用连接字符串做任何数据库活动。您可以在代码中调用它,如下所示:

var connectionString = Environment.GetEnvironmentVariable("DefaultConnection");
or
var connectionString = Configuration.GetConnectionString("DefaultConnection");
or 
string connectionString = ConfigurationSettings.AppSettings("DefaultConnection");

当使用直接连接(不是 DSN 字符串)时,这完全取决于您如何构建连接;如果您使用的是 new SqlConnection(...),那么一切都归结为 您的代码 ;更改实现就像添加包引用和更改 using 指令一样简单

using System.Data.SqlClient;

using Microsoft.Data.SqlClient;

这意味着您的new SqlConnection(...)现在正在谈论一种完全不同的类型,恰好在两个地方都被称为SqlConnection


如果您通过应用程序配置使用自动提供程序模型,则需要在那里更改提供程序,即

<add name="Name" providerName="System.Data.SqlClient" connectionString="..." /> 

变成

<add name="Name" providerName="Microsoft.Data.SqlClient" connectionString="..." /> 

这通常与类似的东西一起使用:

internal static DbConnection CreateConnection(string name)
{
    var config = ConfigurationManager.ConnectionStrings[name];
    if (config is null)
    {
        // throw some specific exception, or return null; whatever you want to do
    }
    var factory = DbProviderFactories.GetFactory(config.ProviderName);
    var connection = factory.CreateConnection(); // note: not "using" - caller is owner
    connection.ConnectionString = connection.ConnectionString;
    return connection;
}

本主题更详细 here 以及示例 <configuration> 场景。