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.