У меня есть строка подключения, и я хочу, чтобы заглянуть, например, "Источник данных". Есть ли синтаксический анализатор, или мне нужно искать строку?
Есть ли какой-либо синтаксический анализатор строк в С#?
Ответ 1
Да, существует класс  System.Data.Common.DbConnectionStringBuilder.
Класс DbConnectionStringBuilder предоставляет базовый класс, из которого строго типизированная строка подключения строителей (SqlConnectionStringBuilder, OleDbConnectionStringBuilder и т.д. on). Строка подключения строители позволяют разработчикам программно создавать синтаксически правильные строки подключения и синтаксический анализ и перестроить существующее соединение строки.
Подклассы, представляющие интерес:
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;
Ответ 2
Существуют сборщики строковых соединений для конкретного поставщика от различных поставщиков, таких как 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 в Where предложение важно только в том случае, если вам нужно обходить плохо отформатированные строки подключения, такие как server = localhost;pp;, где pp ничего не добавляет. Чтобы вести себя как обычные строители (которые взорвались бы в этих случаях), измените Where на
.Where(kvp => !string.IsNullOrWhitespace(kvp))
Ответ 3
Вот пара строк кода, которые будут разбирать любую строку соединения в словаре:
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"];
Ответ 4
Используйте SqlConnectionStringBuilder К сожалению, вам придется использовать конкретный DBStringBuilder, поскольку строки подключения отличаются.
Ответ 5
Вы хотите использовать DbProviderFactory.CreateConnectionStringBuilder(), который предоставляет вам строковый конструктор/парсер соединений, специфичный для вашего коннектора, но не требует вы должны использовать любые специальные классы коннекторов.
Ответ 6
Да, вы можете сделать это, используя классы 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 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);
Ответ 7
Вы можете использовать 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
EDIT:
Так как DbConnectionStringBuilder реализует IDictionary, вы можете перечислить параметры строки подключения:
foreach (KeyValuePair<string, object> kv in builder)
{
    Console.WriteLine("{0}: {1}", kv.Key, kv.Value);
}
Ответ 8
Поэтому я нашел, что все существующие ответы были более или менее ошибочными. Я получил следующее тривиальное решение:
class ConnectionStringParser: DbConnectionStringBuilder {
    ConnectionStringParser(string c) { Connection = c; }
    public override bool ShouldSerialize(string keyword) => true;
}
Парсер находится в DbConnectionStringBuilder и почти легко доступен. Единственная глупая вещь, которую мы должны сделать, это установить ShouldSerialize, чтобы всегда возвращать true, чтобы не потерять компоненты при попытке произвольных строк соединения в оба конца.
Ответ 9
Мне здесь не понравились все ответы. Итак, вот что я нашел.
С.NET Core
 Вы можете напрямую использовать DbConnectionStringBuilder:
var builder = new System.Data.Common.DbConnectionStringBuilder();
builder.ConnectionString = settings.ConnectionString;
var server = builder["server"];
