我有一个连接字符串,我希望能够窥视例如“数据源”。 是否有解析器,或者我必须搜索字符串?


当前回答

使用SqlConnectionStringBuilder 不幸的是,由于连接字符串不同,您将不得不使用特定于DB的ConnectionStringBuilder。

其他回答

是的,你可以使用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);

所以我发现所有现有的答案或多或少都是错误的。我最终得到了以下简单的解决方案:

class ConnectionStringParser: DbConnectionStringBuilder {
    ConnectionStringParser(string c) { Connection = c; }
    public override bool ShouldSerialize(string keyword) => true;
}

解析器在DbConnectionStringBuilder中,非常容易获取。我们必须做的唯一愚蠢的事情是将ShouldSerialize设置为总是返回true,以防止在尝试往返任意连接字符串时丢失组件。

你想要使用DbProviderFactory。CreateConnectionStringBuilder(),它为您提供特定于连接器的连接字符串构建器/解析器,但不要求您使用任何特定于连接器的类。

这里有几行代码,可以将任何连接字符串解析到字典中:

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"];

使用SqlConnectionStringBuilder 不幸的是,由于连接字符串不同,您将不得不使用特定于DB的ConnectionStringBuilder。