[C#] C #에 연결 문자열 파서가 있습니까?

연결 문자열이 있는데 예를 들어 “데이터 소스”를 볼 수 있기를 원합니다. 파서가 있습니까, 아니면 문자열을 검색해야합니까?



답변

예, 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 서버 연결 문자열에서 “데이터 소스를 엿보기”위해 다음을 수행 할 수 있습니다.

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에 특별한 것이 필요하지 않습니다. Containsin Where절은 server = localhost;pp;where pp에 아무것도 추가하지 않는 것과 같이 형식이 잘못된 연결 문자열을 무시해야하는 경우에만 중요합니다 . 변경 (이 경우에 폭발 할 것이다) 일반 빌더처럼 행동하기 Where에를

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


답변

다음은 연결 문자열을 사전으로 구문 분석하는 몇 줄의 코드입니다.

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를 사용해야합니다.


답변

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


답변

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를 구현하므로 연결 문자열 매개 변수를 열거 할 수 있습니다.

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