Существуют специальные компоновщики строк подключения от разных поставщиков, такие как SqlConnectionStringBuilder
, MySqlConnectionStringBuilder
, SQLiteConnectionStringBuilder
и т. Д. (К сожалению, на этот раз нет открытого интерфейса от MS).В противном случае у вас есть DbProviderFactory.CreateConnectionStringBuilder , который даст вам альтернативный способ написания, независимый от поставщика.Вам нужно будет указать провайдера в конфигурационном файле и иметь правильную версию dll.Например,
var c = "server=localhost;User Id=root;database=ppp";
var f = DbProviderFactories.GetFactory("MySql.Data.MySqlClient"); //your provider
var b = f.CreateConnectionStringBuilder();
b.ConnectionString = c;
var s = b["data source"];
var d = b["database"];
Однажды я написал для себя ручной анализ, который не доставил мне никаких проблем.Было бы тривиально расширить это, чтобы предоставить информацию о других параметрах (сейчас это только для простых вещей, таких как имя БД, источник данных, имя пользователя и пароль).Примерно так:
static readonly string[] serverAliases = { "server", "host", "data source", "datasource", "address",
"addr", "network address" };
static readonly string[] databaseAliases = { "database", "initial catalog" };
static readonly string[] usernameAliases = { "user id", "uid", "username", "user name", "user" };
static readonly string[] passwordAliases = { "password", "pwd" };
public static string GetPassword(string connectionString)
{
return GetValue(connectionString, passwordAliases);
}
public static string GetUsername(string connectionString)
{
return GetValue(connectionString, usernameAliases);
}
public static string GetDatabaseName(string connectionString)
{
return GetValue(connectionString, databaseAliases);
}
public static string GetServerName(string connectionString)
{
return GetValue(connectionString, serverAliases);
}
static string GetValue(string connectionString, params string[] keyAliases)
{
var keyValuePairs = connectionString.Split(';')
.Where(kvp => kvp.Contains('='))
.Select(kvp => kvp.Split(new char[] { '=' }, 2))
.ToDictionary(kvp => kvp[0].Trim(),
kvp => kvp[1].Trim(),
StringComparer.InvariantCultureIgnoreCase);
foreach (var alias in keyAliases)
{
string value;
if (keyValuePairs.TryGetValue(alias, out value))
return value;
}
return string.Empty;
}
Для этого вам не нужно ничего особенного в конфигурационном файле или вообще никакой dll.Предложение Contains
в Where
важно, только если вам нужно обойти плохо отформатированные строки подключения, такие как server = localhost;pp;
, где pp
ничего не добавляет.Чтобы вести себя как обычные строители (которые в этих случаях взорвутся), измените Where
на
.Where(kvp => !string.IsNullOrWhitespace(kvp))