.net - net - create connection string
C#Recuperando el objeto DbConnection correcto por cadena de conexión (4)
Tengo una cadena de conexión que se pasa a una función, y necesito crear un objeto basado en DbConnection (es decir, SQLConnection, OracleConnection, OLEDbConnection, etc.) basado en esta cadena.
¿Hay alguna función incorporada para hacer esto o bibliotecas de terceros para ayudarlo? No estamos construyendo necesariamente esta cadena de conexión, por lo que no podemos confiar en un formato en el que esté escrita la cadena para determinar su tipo, y preferiría no tener que codificar todas las combinaciones y permutaciones de posibles cadenas de conexión.
Debería poder analizar la sección Proveedor y pasarla a DbProviderFactories.GetFactory, que devolverá una OdbcFactory, OleDbFactory o SqlClientFactory y le permitirá realizar CreateConnection, etc.
No estoy seguro de cómo esto funcionaría con Oracle a menos que proporcionen un OracleDbFactory.
Si está utilizando Framework 2.0 o superior, y puede hacer que pase en una segunda cadena con la clase de controlador, puede usar la clase dbProviderFactory para cargar el controlador por usted.
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;
Aquí hay un enlace de MSDN a la clase de fábrica: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx
DbConnection GetConnection(string connStr)
{ string providerName = null;
var csb = new DbConnectionStringBuilder{ConnectionString=connStr};
if (csb.ContainsKey("provider"))
{ providerName = csb["provider"].ToString();
}
else
{ var css = ConfigurationManager
.ConnectionStrings
.Cast<ConnectionStringSettings>()
.FirstOrDefault(x=>x.ConnectionString==connStr);
if (css != null) providerName = css.ProviderName;
}
if (providerName != null)
{ var providerExists = DbProviderFactories
.GetFactoryClasses()
.Rows.Cast<DataRow>()
.Any(r=>r[2].Equals(providerName));
if (providerExists)
{ var factory = DbProviderFactories.GetFactory(providerName);
var dbConnection = factory.CreateConnection();
dbConnection.ConnectionString = connStr;
return dbConnection;
}
}
return null;
}
La mayoría de las cadenas de conexión (al menos en .NET 2.0) también tienen una propiedad providerName que las acompaña. Entonces, una cadena de conexión SQL tendrá un nombre de proveedor como:
providerName="System.Data.SqlClient"
Por lo tanto, su método debería aceptar tanto la cadena de conexión como el nombre del proveedor y luego podría usar DbProviderFactory tal como lo menciona damieng .