Domanda

Ho una stringa di connessione passata a una funzione e ho bisogno di creare un oggetto basato su DbConnection (cioè SQLConnection, OracleConnection, OLEDbConnection ecc.) basato su questa stringa.

C'è qualche funzionalità integrata per fare questo, o eventuali librerie di terze parti per aiutare. Non stiamo necessariamente costruendo questa stringa di connessione, quindi non possiamo fare affidamento su un formato in cui è scritta la stringa per determinarne il tipo e preferirei preferire di non dover codificare tutte le combinazioni e permutazioni di possibili connessioni stringhe

È stato utile?

Soluzione

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

Altri suggerimenti

se si utilizza Framework 2.0 o versione successiva e è possibile farli passare in una seconda stringa con la classe driver, è possibile utilizzare la classe dbProviderFactory per caricare il driver per te.

DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass);
DbConnection dbConnection = dbProviderFactory.CreateConnection();
dbConnection.ConnectionString = myConnectionString;

Ecco un collegamento MSDN alla classe Factory: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

Dovresti essere in grado di analizzare la sezione Provider e passarla in DbProviderFactories.GetFactory che restituirà un OdbcFactory, OleDbFactory o SqlClientFactory e ti permetterà quindi di eseguire CreateConnection ecc.

Non sono sicuro di come funzionerebbe con Oracle se non fornissero una OracleDbFactory.

La maggior parte delle stringhe di connessione (almeno in .NET 2.0) ha anche una proprietà providerName che ne deriva. Quindi una stringa di connessione SQL avrà un nome provider come:

providerName="System.Data.SqlClient"

Quindi il tuo metodo dovrebbe accettare sia la stringa di connessione sia il nome del provider e quindi potresti usare DbProviderFactory come menzionato da Damieng .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top