ASP.NET: как создать соединение из строки подключения web.config? - PullRequest
10 голосов
/ 26 июня 2009

Как построить DbConnection на основе имени поставщика ?

Образец Название поставщика s

  • System.Data.SqlClient
  • System.Data.OleDb
  • System.Data.Odbc
  • FirebirdSql.Data.FirebirdClient

У меня есть строки подключения, хранящиеся в файле web.config моего IIS-сервера:

<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 создать, например ::1010*

  • SqlConnection
  • OleDbConnection
  • OdbcConnection
  • FbConnection

Записи connectionStrings содержат providerName , но они не являются именами классов-потомков DbConnection, а выглядят как пространство имен

Как включить построение DbConnection на основе строки providerName ?


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();

}

Ответы [ 3 ]

15 голосов
/ 26 июня 2009

Если вы пойдете по этому пути, я думаю, вы захотите использовать класс DbProviderFactories, чтобы получить DbProviderFactory, который вы можете использовать для построения соединения. Я не пробовал этот код, но я думаю, что он будет работать. Возможно, вам потребуется поискать имя поставщика с помощью метода GetFactoryClasses класса DbProviderFactories и использовать 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;
}
0 голосов
/ 26 июня 2009

Если providerName для конкретного имени соединения (dev, test, prod) никогда не меняется, почему вы не можете переключить параметр connectionName для вашего метода и установить экземпляр providerName таким образом?

0 голосов
/ 26 июня 2009

Ознакомьтесь с этим блогом Hanselman о добавлении пользовательских типов сборки для разных имен строк подключения. Похоже, что это может соответствовать тому, что вы хотите достичь, иным способом, чем использование типов поставщиков.

...