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


当前回答

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

其他回答

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

是的,有system。data。common。dbconnectionstringbuilder类。

DbConnectionStringBuilder类 类的基类 强类型的连接字符串 建筑商(SqlConnectionStringBuilder OleDbConnectionStringBuilder,等等 )获得。连接字符串 构建者让开发人员 以编程方式创建语法 正确连接字符串,并进行解析 并重建现有连接 字符串。

感兴趣的子类是:

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

例如,要从SQL-server连接字符串中“窥视数据源”,你可以这样做:

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

有来自不同提供商的特定于供应商的连接字符串构建器,如SqlConnectionStringBuilder, MySqlConnectionStringBuilder, SQLiteConnectionStringBuilder等(不幸的是,这次没有来自MS的公共接口)。否则你有DbProviderFactory。CreateConnectionStringBuilder会给你另一种不可知提供程序的方式。您需要在配置文件中指定提供者,并有正确版本的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"];

我曾经为自己编写过手动解析,这并没有给我带来任何麻烦。这将是微不足道的扩展,以提供其他参数的信息(目前它只用于简单的东西,如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;
}

为此,你不需要在配置文件或任何dll中任何特殊的东西。Contains in Where子句很重要,只有当你需要绕过糟糕格式的连接字符串,如server = localhost;pp;pp没有任何作用。要像正常的构建器一样(在这些情况下会爆炸),请更改Where To

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

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

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

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

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