Existe-t-il un parsingur de chaîne de connexion en C #?

J’ai une chaîne de connexion et je veux pouvoir voir par exemple “Source de données”. Y a-t-il un parsingur ou dois-je rechercher la chaîne?

Oui, il existe la classe System.Data.Common.DbConnectionSsortingngBuilder .

La classe DbConnectionSsortingngBuilder fournit la classe de base dont dérivent les générateurs de chaînes de connexion fortement typés (SqlConnectionSsortingngBuilder, OleDbConnectionSsortingngBuilder, etc.). Les générateurs de chaînes de connexion permettent aux développeurs de créer par programmation des chaînes de connexion syntaxiquement correctes, d’parsingr et de reconstruire les chaînes de connexion existantes.

Les sous-classes d’intérêt sont:

 System.Data.EntityClient.EntityConnectionSsortingngBuilder System.Data.Odbc.OdbcConnectionSsortingngBuilder System.Data.OleDb.OleDbConnectionSsortingngBuilder System.Data.OracleClient.OracleConnectionSsortingngBuilder System.Data.SqlClient.SqlConnectionSsortingngBuilder 

Par exemple, pour “regarder la source de données” à partir d’une chaîne de connexion SQL-server, vous pouvez:

 var builder = new SqlConnectionSsortingngBuilder(connectionSsortingng); var dataSource = builder.DataSource; 

Il existe des générateurs de chaînes de connexion spécifiques à un fournisseur provenant de différents fournisseurs, tels que SqlConnectionSsortingngBuilder , MySqlConnectionSsortingngBuilder , SQLiteConnectionSsortingngBuilder etc. Sinon, vous avez DbProviderFactory.CreateConnectionSsortingngBuilder qui vous donnera une autre manière d’écrire de manière indépendante du fournisseur. Vous devez spécifier le fournisseur dans le fichier de configuration et avoir la bonne version de 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.CreateConnectionSsortingngBuilder(); b.ConnectionSsortingng = c; var s = b["data source"]; var d = b["database"]; 

J’avais une fois écrit une parsing manuelle pour moi-même, ce qui ne me posait aucun problème. Ce serait sortingvial d’étendre cela pour donner des informations sur d’autres parameters (en ce moment, c’est uniquement pour des choses simples comme le nom de la firebase database, la source de données, le nom d’utilisateur et le mot de passe). Comme ceci ou cela:

 static readonly ssortingng[] serverAliases = { "server", "host", "data source", "datasource", "address", "addr", "network address" }; static readonly ssortingng[] databaseAliases = { "database", "initial catalog" }; static readonly ssortingng[] usernameAliases = { "user id", "uid", "username", "user name", "user" }; static readonly ssortingng[] passwordAliases = { "password", "pwd" }; public static ssortingng GetPassword(ssortingng connectionSsortingng) { return GetValue(connectionSsortingng, passwordAliases); } public static ssortingng GetUsername(ssortingng connectionSsortingng) { return GetValue(connectionSsortingng, usernameAliases); } public static ssortingng GetDatabaseName(ssortingng connectionSsortingng) { return GetValue(connectionSsortingng, databaseAliases); } public static ssortingng GetServerName(ssortingng connectionSsortingng) { return GetValue(connectionSsortingng, serverAliases); } static ssortingng GetValue(ssortingng connectionSsortingng, params ssortingng[] keyAliases) { var keyValuePairs = connectionSsortingng.Split(';') .Where(kvp => kvp.Contains('=')) .Select(kvp => kvp.Split(new char[] { '=' }, 2)) .ToDictionary(kvp => kvp[0].Trim(), kvp => kvp[1].Trim(), SsortingngComparer.InvariantCultureIgnoreCase); foreach (var alias in keyAliases) { ssortingng value; if (keyValuePairs.TryGetValue(alias, out value)) return value; } return ssortingng.Empty; } 

Pour cela, vous n’avez besoin de rien de spécial dans le fichier de configuration, ni de dll du tout. Contains dans la clause Where est important uniquement si vous devez ignorer des chaînes de connexion mal formatées telles que server = localhost;pp;pp ajoute à rien. Pour se comporter comme des constructeurs normaux (qui exploseraient dans ces cas), modifiez le

 .Where(kvp => !ssortingng.IsNullOrWhitespace(kvp)) 

Voici quelques lignes de code qui parsingnt toute chaîne de connexion dans un dictionnaire:

 Dictionary connSsortingngParts = connSsortingng.Split(';') .Select(t => t.Split(new char[] { '=' }, 2)) .ToDictionary(t => t[0].Trim(), t => t[1].Trim(), SsortingngComparer.InvariantCultureIgnoreCase); 

Et puis vous pouvez accéder à n’importe quelle partie:

 ssortingng dataSource = connSsortingngParts["Data Source"]; 

Utilisez le SqlConnectionSsortingngBuilder Malheureusement, vous devrez utiliser un ConnectionSsortingngBuilder spécifique à la firebase database car les chaînes de connexion diffèrent.

Vous souhaitez utiliser DbProviderFactory.CreateConnectionSsortingngBuilder () qui vous fournit un générateur / parsingur de chaîne de connexion spécifique à votre connecteur, mais ne nécessite aucune utilisation de classes spécifiques au connecteur.

Oui, vous pouvez le faire en utilisant les classes ConnectionSsortingngBuilder. Voici la liste des implémentations DbConnectionSsortingngBuilder disponibles pour les fournisseurs de données standard:

 System.Data.Odbc.OdbcConnectionSsortingngBuilder System.Data.OleDb.OleDbConnectionSsortingngBuilder System.Data.OracleClient.OracleConnectionSsortingngBuilder System.Data.SqlClient.SqlConnectionSsortingngBuilder 

Voici un exemple d’exemple de chaîne de connexion d’parsing et affiche ses éléments.

  ssortingng conSsortingng = @"Data Source=.\sqlexpress;" + "Database=Northwind;Integrated Security=SSPI;" + "Min Pool Size=5;Max Pool Size=15;Connection Reset=True;" + "Connection Lifetime=600;"; // Parse the SQL Server connection ssortingng and display it's properties SqlConnectionSsortingngBuilder objSB1 = new SqlConnectionSsortingngBuilder(conSsortingng); Response.Write("Parsed SQL Connection Ssortingng Parameters:"); Response.Write(" 
Database Source = " + objSB1.DataSource); Response.Write("
Database = " + objSB1.InitialCatalog); Response.Write("
Use Integrated Security = " + objSB1.IntegratedSecurity); Response.Write("
Min Pool Size = " + objSB1.MinPoolSize); Response.Write("
Max Pool Size = " + objSB1.MaxPoolSize); Response.Write("
Lifetime = " + objSB1.LoadBalanceTimeout);

Vous pouvez utiliser DbConnectionSsortingngBuilder et vous n’avez besoin d’aucun fournisseur spécifique:

Le code suivant:

 var cnstr = "Data Source=data source value;Server=ServerValue"; var builder = new DbConnectionSsortingngBuilder(); builder.ConnectionSsortingng = cnstr; Console.WriteLine("Data Source: {0}", builder["Data Source"]); Console.WriteLine("Server: {0}", builder["Server"]); 

Sorties à la console:

 Data Source: data source value Server: ServerValue 

MODIFIER:

Comme DbConnectionSsortingngBuilder implémente IDictionary, vous pouvez énumérer les parameters de chaîne de connexion:

 foreach (KeyValuePair kv in builder) { Console.WriteLine("{0}: {1}", kv.Key, kv.Value); } 

J’ai donc trouvé toutes les réponses existantes plus ou moins fausses. J’ai fini avec la solution sortingviale suivante:

 class ConnectionSsortingngParser: DbConnectionSsortingngBuilder { ConnectionSsortingngParser(ssortingng c) { Connection = c; } public override bool ShouldSerialize(ssortingng keyword) => true; } 

L’parsingur se trouve dans DbConnectionSsortingngBuilder et est assez facile à obtenir. La seule chose idiote que nous ayons à faire est de définir ShouldSerialize pour qu’il retourne toujours true pour éviter de perdre des composants lorsque vous essayez de faire tourner des chaînes de connexion arbitraires.