C#中是否有连接字符串解析器?

Ami*_*aei 176 .net c#

我有一个连接字符串,我希望能够查看例如"数据源".有解析器,还是我必须搜索字符串?

Ani*_*Ani 293

是的,有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
Run Code Online (Sandbox Code Playgroud)

例如,要从SQL服务器连接字符串中"查看数据源",您可以执行以下操作:

var builder = new SqlConnectionStringBuilder(connectionString);
var dataSource = builder.DataSource;
Run Code Online (Sandbox Code Playgroud)

  • 基类DbConnectionStringBuilder具有通用处理功能,无需使用子类即可使用:if(builder.TryGetValue(“ Password”,var pwd)){字符串已解密= SomehowDecrypt(pwd); builder [“ Password”] =解密;}` (2认同)

naw*_*fal 37

有来自不同供应商,如供应商特定的连接字符串的建设者SqlConnectionStringBuilder,MySqlConnectionStringBuilder,SQLiteConnectionStringBuilder等(遗憾的是,从MS这次没有公共接口).否则你有DbProviderFactory.CreateConnectionStringBuilder,它将为你提供另一种方法来编写与提供者无关的方式.您需要在配置文件中指定provider并提供正确的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"];
Run Code Online (Sandbox Code Playgroud)

我曾经为自己编写了手动解析,但没有给我任何麻烦.扩展它以提供其他参数的信息是微不足道的(现在它仅用于简单的事情,如数据库名称,数据源,用户名和密码).像这样左右:

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;
}
Run Code Online (Sandbox Code Playgroud)

为此,您在配置文件或任何dll中都不需要任何特殊功能.只有当你需要绕过格式不正确的连接字符串时,Containsin Where子句才是重要的,比如server = localhost;pp;pp什么地方添加任何东西.要像普通的构建器一样(在这些情况下会爆炸),请更改Where

.Where(kvp => !string.IsNullOrWhitespace(kvp))
Run Code Online (Sandbox Code Playgroud)

  • 如果用户的密码中包含`';'`或`'='`,则GetValue()方法将无效.我编写了类似的实现,并了解到它并没有成功.天哪,连接字符串解析实际上比我想象的要难得多! (3认同)

And*_*rei 19

我不太喜欢这里的所有答案。这就是我发现的。

数据库连接字符串生成器

您可以直接使用内置的DbConnectionStringBuilder

var builder = new System.Data.Common.DbConnectionStringBuilder();
builder.ConnectionString = "server=localhost;login=sa;pass=awesomeness";

var server = builder["server"];
var login = builder["login"];
var pass = builder["pass"];
Run Code Online (Sandbox Code Playgroud)


cod*_*sam 13

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

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

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

string dataSource = connStringParts["Data Source"];
Run Code Online (Sandbox Code Playgroud)

  • 聪明,我唯一要改变的就是在第一次拆分时包含`StringSplitOptions.RemoveEmptyEntries`,因为如果有一个尾随的```它将导致`IndexOutOfRange`异常. (3认同)
  • 这可行,但连接字符串构建器更强大.像这样的代码将抛出低级异常,而不是在无效连接字符串的情况下更有意义的解析错误. (2认同)

Ern*_*rno 6

使用SqlConnectionStringBuilder 不幸的是,您必须使用特定于DB的ConnectionStringBuilder,因为连接字符串不同.


Dav*_*len 6

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


Jay*_*hia 5

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

System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
Run Code Online (Sandbox Code Playgroud)

以下是解析连接字符串并显示其元素的示例。

 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);
Run Code Online (Sandbox Code Playgroud)