Il existe des constructeurs de chaînes de connexion spécifiques à chaque fournisseur, tels que SqlConnectionStringBuilder
, MySqlConnectionStringBuilder
, SQLiteConnectionStringBuilder
etc (malheureusement, il n'y a pas d'interface publique de MS pour le moment). Sinon, vous avez DbProviderFactory.CreateConnectionStringBuilder qui vous donnera une autre façon de l'écrire, sans tenir compte du fournisseur. Vous devrez spécifier le fournisseur dans le fichier de configuration et avoir la bonne version de la dll disponible. Par exemple..,
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"];
J'ai déjà écrit une analyse manuelle pour moi-même qui ne m'a posé aucun problème. Il serait trivial d'étendre cela pour donner des informations sur d'autres paramètres (pour l'instant, cela ne concerne que des choses simples comme le nom de la base de données, la source de données, le nom d'utilisateur et le mot de passe). Comme ceci ou ainsi :
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;
}
Pour cela, vous n'avez besoin de rien de spécial dans le fichier de configuration, ni d'aucune dll. Contains
sur Where
n'est importante que si vous devez contourner des chaînes de connexion mal formatées telles que server = localhost;pp;
donde pp
n'ajoute rien. Pour se comporter comme des constructeurs normaux (qui exploseraient dans ces cas-là), changez le paramètre Where
a
.Where(kvp => !string.IsNullOrWhitespace(kvp))