在C#中有任何连接stringparsing器?

我有一个连接string,我希望能够偷看例如“数据源”。 有parsing器,还是我必须searchstring?

是的,这里有System.Data.Common.DbConnectionStringBuilder类。

DbConnectionStringBuilder类提供强types连接string构build器(SqlConnectionStringBuilder,OleDbConnectionStringBuilder等)派生的基类。 连接string构build器让开发人员以编程方式创build语法上正确的连接string,并parsing和重build现有的连接string。

感兴趣的子类是:

 System.Data.EntityClient.EntityConnectionStringBuilder System.Data.Odbc.OdbcConnectionStringBuilder System.Data.OleDb.OleDbConnectionStringBuilder System.Data.OracleClient.OracleConnectionStringBuilder System.Data.SqlClient.SqlConnectionStringBuilder 

例如,要从SQL服务器连接string中“偷看数据源”,您可以执行以下操作:

 var builder = new SqlConnectionStringBuilder(connectionString); var dataSource = builder.DataSource; 

有像SqlConnectionStringBuilderMySqlConnectionStringBuilderSQLiteConnectionStringBuilder等供应商特定的连接stringbuild设者从不同的提供者(不幸的是没有来自MS这个时候的公共接口)。 否则,你有DbProviderFactory.CreateConnectionStringBuilder ,它会给你一个替代方法来写它提供者不可知的方式。 您需要在configuration文件中指定提供程序,并提供适当的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"]; 

我曾经为自己写过手工parsing,这并没有给我带来麻烦。 将其扩展为给其他参数(现在它只适用于db名称,数据源,用户名和密码等简单的东西)的信息是微不足道的。 像这样左右:

 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; } 

为此,你不需要任何特别的configuration文件,或任何DLL。 只有在需要绕过格式不正确的连接string(如server = localhost;pp; pp增加到没有。 要像正常的build设者(这些会在这种情况下爆炸),改变去Where

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

这里有几行代码可以将任何连接stringparsing成字典:

 Dictionary<string, string> connStringParts = connString.Split(';') .Select(t => t.Split(new char[] { '=' }, 2)) .ToDictionary(t => t[0].Trim(), t => t[1].Trim(), StringComparer.InvariantCultureIgnoreCase); 

然后你可以访问任何部分:

 string dataSource = connStringParts["Data Source"]; 

您想要使用DbProviderFactory.CreateConnectionStringBuilder() ,它为您提供连接器特定的连接string构build器/分析器,但不要求您使用任何连接器特定的类。

使用SqlConnectionStringBuilder不幸的是,由于连接string的不同,您将不得不使用特定于数据库的ConnectionStringBuilder。

是的,您可以使用ConnectionStringBuilder类来完成此操作。 以下是标准数据提供者可用的DbConnectionStringBuilder实现列表:

 System.Data.Odbc.OdbcConnectionStringBuilder System.Data.OleDb.OleDbConnectionStringBuilder System.Data.OracleClient.OracleConnectionStringBuilder System.Data.SqlClient.SqlConnectionStringBuilder 

这里是parsing连接string的示例,并显示它的元素。

  string conString = @"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 string and display it's properties SqlConnectionStringBuilder objSB1 = new SqlConnectionStringBuilder(conString); Response.Write("<b>Parsed SQL Connection String Parameters:</b>"); Response.Write(" <br/> Database Source = " + objSB1.DataSource); Response.Write(" <br/> Database = " + objSB1.InitialCatalog); Response.Write(" <br/> Use Integrated Security = " + objSB1.IntegratedSecurity); Response.Write(" <br/> Min Pool Size = " + objSB1.MinPoolSize); Response.Write(" <br/> Max Pool Size = " + objSB1.MaxPoolSize); Response.Write(" <br/> Lifetime = " + objSB1.LoadBalanceTimeout); 

你可以使用DbConnectionStringBuilder,你不需要任何特定的提供者:

以下代码:

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

输出到控制台:

 Data Source: data source value Server: ServerValue 

编辑:

由于DbConnectionStringBuilder实现了IDictionary,因此可以枚举连接string参数:

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