C # Получение правильного объекта DbConnection по строке подключения
-
06-07-2019 - |
Вопрос
У меня есть строка подключения, передаваемая в функцию, и мне нужно создать объект на основе 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 .