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

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

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

Ответы [ 4 ]

30 голосов
/ 09 октября 2008
   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;
   }
19 голосов
/ 09 октября 2008

Если вы используете 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

1 голос
/ 09 октября 2008

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

providerName="System.Data.SqlClient"

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

1 голос
/ 09 октября 2008

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

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

...