我有一个连接字符串,我希望能够窥视例如“数据源”。 是否有解析器,或者我必须搜索字符串?
当前回答
这里有几行代码,可以将任何连接字符串解析到字典中:
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(),它为您提供特定于连接器的连接字符串构建器/解析器,但不要求您使用任何特定于连接器的类。
使用SqlConnectionStringBuilder 不幸的是,由于连接字符串不同,您将不得不使用特定于DB的ConnectionStringBuilder。
所以我发现所有现有的答案或多或少都是错误的。我最终得到了以下简单的解决方案:
class ConnectionStringParser: DbConnectionStringBuilder {
ConnectionStringParser(string c) { Connection = c; }
public override bool ShouldSerialize(string keyword) => true;
}
解析器在DbConnectionStringBuilder中,非常容易获取。我们必须做的唯一愚蠢的事情是将ShouldSerialize设置为总是返回true,以防止在尝试往返任意连接字符串时丢失组件。
你可以使用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实现了dicictionary,你可以枚举连接字符串参数:
foreach (KeyValuePair<string, object> kv in builder)
{
Console.WriteLine("{0}: {1}", kv.Key, kv.Value);
}
是的,你可以使用ConnectionStringBuilder类做到这一点。 下面是用于标准数据提供者的可用DbConnectionStringBuilder实现的列表:
System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
下面是解析连接字符串并显示其元素的示例。
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);
推荐文章
- _ViewStart的位置和方式。CSHTML布局文件链接?
- 新建T()
- 如何将枚举绑定到WPF中的组合框控件?
- 拒绝访问该路径
- Visual Studio - Resx文件默认“内部”为“公共”
- 使用linq转换列表到字典,不用担心重复
- 单元测试:日期时间。现在
- 什么是回调?
- .NET中的KeyDown和KeyPress有什么区别?
- 返回匿名类型的结果?
- 你能解释一下流的概念吗?
- 何时使用IList,何时使用List
- ConfigurationManager。AppSettings在.NET Core 2.0中可用?
- 在c#的控制台应用程序中使用'async
- 在单元测试中设置HttpContext.Current.Session