Pregunta

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 funcionalidad incorporada para hacer esto, o alguna biblioteca de terceros para ayudar? No estamos necesariamente construyendo esta cadena de conexión, por lo que no podemos confiar en un formato en el que se escriba la cadena para determinar su tipo, y preferiría no tener que codificar todas las combinaciones y permutaciones de posible conexión cadenas

¿Fue útil?

Solución

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

Otros consejos

si está usando el framework 2.0 o superior, y puede hacer que pasen 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 Factory: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

Debería poder analizar la sección Proveedor y pasarla a DbProviderFactories.GetFactory que devolverá un OdbcFactory, OleDbFactory o SqlClientFactory y le permitirá realizar CreateConnection, etc.

No estoy seguro de cómo funcionaría esto con Oracle a menos que proporcionen una OracleDbFactory.

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. Por lo tanto, 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 como lo menciona damieng .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top