【问题标题】:C# Retrieving correct DbConnection object by connection stringC# 通过连接字符串检索正确的 DbConnection 对象
【发布时间】:2010-09-16 04:12:05
【问题描述】:

我有一个连接字符串被传递给一个函数,我需要基于这个字符串创建一个基于 DbConnection 的对象(即 SQLConnection、OracleConnection、OLEDbConnection 等)。

是否有任何内置功能可以执行此操作,或任何第三方库可以提供帮助。我们不一定要构建此连接字符串,因此我们不能依赖写入字符串的格式来确定其类型,我希望不必编写可能连接的所有组合和排列字符串

【问题讨论】:

    标签: .net ado.net connection-string dbconnection


    【解决方案1】:
       DbConnection GetConnection(string connStr)
        { string providerName = null;
          var    csb = new DbConnectionStringBuilder{ConnectionString=connStr};
    
          if (csb.ContainsKey("provider")) 
           { providerName = csb["provider"].ToString();
           }          
          else
           { var css = ConfigurationManager
                               .ConnectionStrings
                               .Cast<ConnectionStringSettings>()
                               .FirstOrDefault(x=>x.ConnectionString==connStr);
             if (css != null) providerName = css.ProviderName;
           }
    
          if (providerName != null) 
           { var providerExists =  DbProviderFactories
                                         .GetFactoryClasses()
                                         .Rows.Cast<DataRow>()
                                         .Any(r=>r[2].Equals(providerName));
             if (providerExists) 
              { var factory = DbProviderFactories.GetFactory(providerName);
                var dbConnection = factory.CreateConnection();
    
                dbConnection.ConnectionString = connStr;
                return dbConnection;
              }
           }
    
          return null;
       }
    

    【讨论】:

    • 我也不认为它适用于 OleDb 连接字符串,例如:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=9cb8a4c4-9661-4c10-a21c-fb4a85ce2471.xlsx;Mode= ReadWrite;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=0;"
    • 不,如果提供者被指定为“System.Data.OleDb”或者在配置中指定了连接字符串,它只会返回一个OLEDB连接。
    • 我觉得这真的很令人惊讶,你不能让你的代码在没有这种麻烦的情况下独立于数据库。
    【解决方案2】:

    如果您使用的是框架 2.0 或更高版本,并且您可以让它们通过驱动程序类传入第二个字符串,您可以使用 dbProviderFactory 类为您加载驱动程序。

    DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
    DbConnection dbConnection = dbProviderFactory.CreateConnection();
    dbConnection.ConnectionString = myConnectionString;
    

    这是 Factory 类的 MSDN 链接: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

    【讨论】:

      【解决方案3】:

      您应该能够解析出 Provider 部分并将其传递给 DbProviderFactories.GetFactory,它将返回 OdbcFactory、OleDbFactory 或 SqlClientFactory,然后让您执行 CreateConnection 等。

      除非 Oracle 提供 OracleDbFactory,否则我不确定这将如何与 Oracle 一起工作。

      【讨论】:

        【解决方案4】:

        大多数连接字符串(至少在 .NET 2.0 中)也有一个 providerName 属性。所以一个 SQL 连接字符串将有一个提供者名称,如:

        providerName="System.Data.SqlClient"
        

        因此,您的方法需要同时接受连接字符串和提供程序名称,然后您可以使用 DbProviderFactory as mentioned by damieng

        【讨论】:

          猜你喜欢
          • 2018-06-29
          • 2010-09-21
          • 2016-09-26
          • 2021-03-04
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-11
          相关资源
          最近更新 更多