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

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

有帮助吗?

解决方案

   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;
   }

其他提示

如果您使用的是框架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

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

除非他们提供OracleDbFactory,否则我不确定它如何与Oracle一起使用。

大多数连接字符串(至少在.NET 2.0中)也有一个与它们一起使用的providerName属性。因此,SQL连接字符串将具有提供者名称,如:

providerName="System.Data.SqlClient"

因此,您的方法需要接受连接字符串和提供者名称,然后您可以使用DbProviderFactory 正如damieng所提到的那样

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top