Ich habe eine Verbindungszeichenfolge und möchte beispielsweise "Datenquelle" sehen können. Gibt es einen Parser oder muss ich die Zeichenfolge durchsuchen?
181
Ja, da ist die System.Data.Common.DbConnectionStringBuilder
Klasse.
Die DbConnectionStringBuilder-Klasse stellt die Basisklasse bereit, von der die stark typisierten Builder für Verbindungszeichenfolgen (SqlConnectionStringBuilder, OleDbConnectionStringBuilder usw.) abgeleitet sind. Mit den Buildern für Verbindungszeichenfolgen können Entwickler programmgesteuert syntaktisch korrekte Verbindungszeichenfolgen erstellen und vorhandene Verbindungszeichenfolgen analysieren und neu erstellen.
Die interessierenden Unterklassen sind:
System.Data.EntityClient.EntityConnectionStringBuilder
System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
Um beispielsweise die Datenquelle aus einer SQL-Server-Verbindungszeichenfolge herauszuschauen, haben Sie folgende Möglichkeiten:
var builder = new SqlConnectionStringBuilder(connectionString);
var dataSource = builder.DataSource;
DbConnectionStringBuilder
verfügt über generische Verarbeitungsfunktionen, die ohne Verwendung von Unterklassen verwendet werden können:if (builder.TryGetValue("Password", out var pwd)) { string decrypted = SomehowDecrypt(pwd); builder["Password"] = decrypted; }
Es gibt herstellerspezifische Verbindungszeichenfolge Bauer von verschiedenen Anbietern wie
SqlConnectionStringBuilder
,MySqlConnectionStringBuilder
,SQLiteConnectionStringBuilder
usw. (leider gibt es keine öffentliche Schnittstelle von MS dieses Mal). Andernfalls haben Sie DbProviderFactory.CreateConnectionStringBuilder , mit dem Sie es auf alternative Weise anbieterunabhängig schreiben können. Sie müssten den Anbieter in der Konfigurationsdatei angeben und die richtige Version der DLL zur Verfügung haben. Zum BeispielIch hatte einmal eine manuelle Analyse für mich geschrieben, die mir keine Probleme bereitete. Es wäre trivial, dies zu erweitern, um Informationen zu anderen Parametern zu erhalten (derzeit nur für einfache Dinge wie Datenbankname, Datenquelle, Benutzername und Passwort). So oder so:
Dafür benötigen Sie nichts Besonderes in der Konfigurationsdatei oder überhaupt eine DLL.
Contains
DieWhere
Klausel in ist nur dann wichtig, wenn Sie schlecht formatierte Verbindungszeichenfolgen umgehen müssen, z. B.server = localhost;pp;
wherepp
fügt nichts hinzu. Um sich wie normale Builder zu verhalten (die in diesen Fällen explodieren würden), ändern Sie dasWhere
inquelle
StringComparer.InvariantCultureIgnoreCase
. Siehe dieToDictionary
Überladung';'
oder ein'='
Kennwort in seinem Kennwort hat. Ich hatte eine ähnliche Implementierung geschrieben und festgestellt, dass es nicht auf die harte Tour funktioniert. Meine Güte, das Parsen von Verbindungszeichenfolgen ist tatsächlich viel schwieriger als ich dachte!Hier sind ein paar Codezeilen, die jede Verbindungszeichenfolge in ein Wörterbuch analysieren:
Und dann können Sie auf jedes Teil zugreifen:
quelle
StringSplitOptions.RemoveEmptyEntries
in die erste Teilung, da dies eineIndexOutOfRange
Ausnahme verursacht, wenn es ein Trailing gibt;
SqlConnection
mit der erstellen kannSqlConnectionStringBuilder
.Verwenden des SqlConnectionStringBuilder Leider müssen Sie einen DB-spezifischen ConnectionStringBuilder verwenden, da sich die Verbindungszeichenfolgen unterscheiden.
quelle
Sie möchten DbProviderFactory.CreateConnectionStringBuilder () verwenden , das Ihnen einen für Ihren Connector spezifischen Builder / Parser für Verbindungszeichenfolgen bereitstellt, für den Sie jedoch keine Connector-spezifischen Klassen verwenden müssen.
quelle
Ja, Sie können dies mit ConnectionStringBuilder-Klassen tun. Hier ist die Liste der verfügbaren DbConnectionStringBuilder-Implementierungen für Standarddatenanbieter:
Hier finden Sie ein Beispiel für eine Analyse-Verbindungszeichenfolge und deren Elemente.
quelle
Sie können DbConnectionStringBuilder verwenden und benötigen keinen bestimmten Anbieter:
Der folgende Code:
Ausgaben an die Konsole:
BEARBEITEN:
Da DbConnectionStringBuilder IDictionary implementiert, können Sie die Verbindungszeichenfolgenparameter auflisten:
quelle
Alle Antworten hier haben mir nicht wirklich gefallen. Also hier ist was ich gefunden habe.
Mit .NET Core
Sie können
DbConnectionStringBuilder
direkt verwenden:quelle
Also fand ich, dass alle vorhandenen Antworten mehr oder weniger falsch waren. Am Ende hatte ich die folgende triviale Lösung:
Der Parser befindet sich in DbConnectionStringBuilder und ist ziemlich einfach zu erreichen. Das einzig Dumme, was wir tun müssen, ist, ShouldSerialize so einzustellen, dass immer true zurückgegeben wird, um zu verhindern, dass Komponenten verloren gehen, wenn versucht wird, beliebige Verbindungszeichenfolgen zu umgehen.
quelle