C # Получение правильного объекта DbConnection по строке подключения

StackOverflow https://stackoverflow.com/questions/185474

Вопрос

У меня есть строка подключения, передаваемая в функцию, и мне нужно создать объект на основе DbConnection (то есть SQLConnection, OracleConnection, OLEDbConnection и т. д.) на основе этой строки.

Есть ли какие-либо встроенные функции для этого или какие-либо сторонние библиотеки, чтобы помочь. Мы не обязательно строим эту строку соединения, поэтому мы не можем полагаться на формат, в котором записана строка, чтобы определить ее тип, и я бы предпочел не кодировать все комбинации и перестановки возможного соединения строки

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

Решение

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

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

если вы используете framework 2.0 или выше, и вы можете заставить их передавать вторую строку с классом драйвера, вы можете использовать класс dbProviderFactory, чтобы загрузить драйвер для вас.

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

Вот ссылка MSDN на класс Factory: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

Вы должны иметь возможность проанализировать раздел Provider и передать его в DbProviderFactories.GetFactory, который вернет OdbcFactory, OleDbFactory или SqlClientFactory и позволит вам затем выполнить CreateConnection и т. д.

Я не уверен, как это будет работать с Oracle, если они не предоставляют OracleDbFactory.

Большинство строк подключения (по крайней мере, в .NET 2.0) также имеют свойство providerName, которое идет с ними. Таким образом, строка подключения SQL будет иметь имя поставщика, например:

providerName="System.Data.SqlClient"

Таким образом, ваш метод должен будет принять как строку подключения, так и имя поставщика, а затем вы можете использовать DbProviderFactory как упомянуто damieng .

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