如何控制哪个 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>
场景。
在最近的评论中,有人告诉我:
the default SQL Server client used to be
System.Data.SqlClient
, but more recently there's alsoMicrosoft.Data.SqlClient
- same thing conceptually, but packaged slightly differently and more up to date. It is largely up to you whether to useSystem.Data.SqlClient
orMicrosoft.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>
场景。