Tengo una cadena de conexión y quiero poder ver, por ejemplo, "Fuente de datos". ¿Hay un analizador o tengo que buscar la cadena?
181
Sí, ahí está la System.Data.Common.DbConnectionStringBuilder
clase.
La clase DbConnectionStringBuilder proporciona la clase base de la que derivan los constructores de cadenas de conexión fuertemente tipados (SqlConnectionStringBuilder, OleDbConnectionStringBuilder, etc.). Los creadores de cadenas de conexión permiten a los desarrolladores crear mediante programación cadenas de conexión sintácticamente correctas, y analizar y reconstruir cadenas de conexión existentes.
Las subclases de interés son:
System.Data.EntityClient.EntityConnectionStringBuilder
System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.OracleClient.OracleConnectionStringBuilder
System.Data.SqlClient.SqlConnectionStringBuilder
Por ejemplo, para "ver el origen de datos" desde una cadena de conexión de servidor SQL, puede hacer lo siguiente:
var builder = new SqlConnectionStringBuilder(connectionString);
var dataSource = builder.DataSource;
DbConnectionStringBuilder
tiene características de procesamiento genéricas que se pueden usar sin usar subclases:if (builder.TryGetValue("Password", out var pwd)) { string decrypted = SomehowDecrypt(pwd); builder["Password"] = decrypted; }
Hay proveedores constructores de cadena de conexión específica de diversos proveedores, como
SqlConnectionStringBuilder
,MySqlConnectionStringBuilder
,SQLiteConnectionStringBuilder
etc (por desgracia no hay ninguna interfaz pública de la MS en esta ocasión). De lo contrario, tiene DbProviderFactory.CreateConnectionStringBuilder que le dará una forma alternativa de escribirlo de manera independiente del proveedor. Debería especificar el proveedor en el archivo de configuración y tener disponible la versión correcta de dll. Por ej.Una vez había escrito un análisis manual para mí, lo que no me dio ningún problema. Sería trivial extender esto para dar información sobre otros parámetros (en este momento es solo para cosas simples como nombre de base de datos, fuente de datos, nombre de usuario y contraseña). Así o más o menos:
Para esto, no necesita nada especial en el archivo de configuración, ni ningún dll.
Contains
en laWhere
cláusula es importante solo si necesita omitir cadenas de conexiones mal formateadas comoserver = localhost;pp;
donde no sepp
agrega nada. Para comportarse como constructores normales (que explotarían en estos casos) cambie elWhere
afuente
StringComparer.InvariantCultureIgnoreCase
. Ver laToDictionary
sobrecarga';'
o una'='
contraseña. Había escrito una implementación similar y aprendí que no funciona de la manera difícil. Gosh, el análisis de la cadena de conexión es en realidad mucho más difícil de lo que pensaba.Aquí hay un par de líneas de código que analizarían cualquier cadena de conexión en un diccionario:
Y luego puedes acceder a cualquier parte:
fuente
StringSplitOptions.RemoveEmptyEntries
en la primera división, ya que causará unaIndexOutOfRange
excepción si hay un final;
SqlConnection
con elSqlConnectionStringBuilder
.Use el SqlConnectionStringBuilder Lamentablemente, tendrá que usar un ConnectionStringBuilder específico de la base de datos, ya que las cadenas de conexión difieren.
fuente
Desea usar DbProviderFactory.CreateConnectionStringBuilder () que le proporciona un generador / analizador de cadenas de conexión específico para su conector, pero no requiere que use ninguna clase específica de conector.
fuente
Sí, puede hacerlo utilizando las clases ConnectionStringBuilder. Aquí está la lista de implementaciones de DbConnectionStringBuilder disponibles para proveedores de datos estándar:
Aquí hay un ejemplo de una cadena de conexión de análisis y muestra sus elementos.
fuente
Puede usar DbConnectionStringBuilder y no necesita ningún proveedor específico:
El siguiente código:
Salidas a la consola:
EDITAR:
Como DbConnectionStringBuilder implementa IDictionary, puede enumerar los parámetros de la cadena de conexión:
fuente
Realmente no me gustaron todas las respuestas aquí. Así que aquí está lo que encontré.
Con .NET Core
Puedes usar
DbConnectionStringBuilder
directamente:fuente
Entonces descubrí que todas las respuestas existentes estaban más o menos equivocadas. Terminé con la siguiente solución trivial:
El analizador está en DbConnectionStringBuilder y es bastante fácil de encontrar. La única cosa tonta que tenemos que hacer es configurar a DoesSerialize para que siempre devuelva verdadero para evitar la pérdida de componentes cuando se intentan las cadenas de conexión arbitrarias de ida y vuelta.
fuente