Вопрос

Как вы создаете DbConnection на основе имя поставщика услуг?

Образец имя поставщика услугs

  • System.Data.SqlClient Система.Данные.SqlClient
  • Система.Данные.OleDb
  • Система.Данные.Odbc
  • FirebirdSQL.Данные.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 создавать, например:

  • Соединение с SqlConnection
  • Подключение OLEDB
  • Подключение OdbcConnection
  • Подключение FB

Записи ConnectionStrings содержат Имя поставщика, но это не имена классов-потомков DbConnection , а, по-видимому, пространство имен

Как мне включить построение 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();

}
Это было полезно?

Решение

Если вы пойдете по этому пути, я думаю, вы захотите использовать класс 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;
}

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top