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

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

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

4 ответов


   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


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

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


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

providerName="System.Data.SqlClient"

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