10

如何根据提供者名称构造 DbConnection ?

示例提供者名称

  • System.Data.SqlClient
  • System.Data.OleDb
  • 系统.数据.Odbc
  • FirebirdSql.Data.FirebirdClient

我的 IIS 服务器的 web.config 文件中存储了连接字符串:

<connectionStrings>
  <add name="development"
        connectionString="Provider = IBMDA400; Data Source = MY_SYSTEM_NAME; User Id = myUsername; Password = myPassword;" 
        providerName="System.Data.OleDb" />
  <add name="live" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.Odbc" />
  <add name="testing" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.SqlClient" />
  <add name="offline"
        connectionString="Server=localhost;User=SYSDBA;Password=masterkey;Charser=NONE;Database=c:\data\mydb.fdb"
        providerName="FirebirdSql.Data.FirebirdClient"/>

您可以看到他们都使用不同的提供程序。当我需要创建连接时,我必须知道要创建什么样的 DbConnection,例如:

  • SqlConnection
  • OleDbConnection
  • odbc连接
  • FB连接

connectionStrings 条目包含providerName,但这些不是 DbConnection 后代类的名称,但似乎是命名空间

如何根据字符串providerName构建 DbConnection ?


public DbConnection GetConnection(String connectionName)
{
    //Get the connectionString infomation
    ConnectionStringSettings cs = 
          ConfigurationManager.ConnectionStrings[connectionName];
    if (cs == null)
       throw new ConfigurationException("Invalid connection name \""+connectionName+"\");

    //Create a connection based on the provider
    DbConnection conn = new DbConnection();

}
4

3 回答 3

17

如果你走这条路,我想你会想要使用 DbProviderFactories 类来获取一个 DbProviderFactory ,你可以用它来构造连接。我还没有尝试过这段代码,但我认为它会起作用。您可能需要使用 DbProviderFactories 类上的 GetFactoryClasses 方法查找提供程序名称并使用 InvariantName。

public DbConnection GetConnection(String connectionName)
{
   //Get the connection string info from web.config
   ConnectionStringSettings cs= 
         ConfigurationManager.ConnectionStrings[connectionName];

   //documented to return null if it couldn't be found
   if (cs == null)
      throw new ConfigurationErrorsException("Invalid connection name \""+connectionName+"\"");

   //Get the factory for the given provider (e.g. "System.Data.SqlClient")
   DbProviderFactory factory = 
         DbProviderFactories.GetFactory(cs.ProviderName);

   //Undefined behaviour if GetFactory couldn't find a provider.
   //Defensive test for null factory anyway
   if (factory == null)
      throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");

   //Have the factory give us the right connection object      
   DbConnection conn = factory.CreateConnection();

   //Undefined behaviour if CreateConnection failed
   //Defensive test for null connection anyway
   if (conn == null)
      throw new Exception("Could not obtain connection from factory");

   //Knowing the connection string, open the connection
   conn.ConnectionString = cs.ConnectionString;
   conn.Open()

   return conn;
}
于 2009-06-25T20:39:34.627 回答
0

查看这个 Hanselman 博客,了解为不同的连接字符串名称添加自定义构建类型,看起来它可能适合您想要以不同于使用提供程序类型的方式完成的任务。

于 2009-06-25T20:29:58.360 回答
0

如果特定连接名称(dev、test、prod)的 providerName 永远不会改变,为什么你不能为你的方法打开 connectionName 参数并以这种方式设置 providerName 实例?

于 2009-06-25T20:46:37.233 回答