【问题标题】:How can I control which SQL provider is used for a database connection?如何控制用于数据库连接的 SQL 提供程序?
【发布时间】:2020-11-10 16:16:36
【问题描述】:

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

默认的 SQL Server 客户端曾经是System.Data.SqlClient,但是 最近还有Microsoft.Data.SqlClient - 同样的事情 从概念上讲,但包装略有不同并且更新。 是否使用System.Data.SqlClientMicrosoft.Data.SqlClient

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

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

我如何控制这种东西? .Net 可以从我的连接字符串中自动检测要使用的正确提供程序,还是我必须在 C# 中硬编码是否要使用 Odbc Vs SqlServer?

【问题讨论】:

    标签: .net odbc database-connection


    【解决方案1】:

    当使用直接连接(不是 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 以及示例&lt;configuration&gt; 场景更详细地介绍了此主题。

    【讨论】:

    • @Mr.Boy 当然,添加示例
    【解决方案2】:

    即使您在 webconfig 或 appsettings 中更新了 Odbc 和 Sql Server 的连接字符串,如果您需要在代码中使用它,您也需要在 C# 代码中调用连接字符串来执行任何 db 活动。您可以在下面的代码中调用它:

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

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2015-06-05
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      相关资源
      最近更新 更多