Frage

Ich habe eine Verbindungszeichenfolge an eine Funktion übergeben wird, und ich brauche ein DbConnection Basis-Objekt (das heißt SQLConnection-, OracleConnection, OleDbConnection usw.) zu erstellen, basierend auf dieser Zeichenfolge.

Gibt es eine eingebaute Funktionalität, dies zu tun, oder alle 3rd-Party-Bibliotheken zu unterstützen. Wir sind nicht notwendigerweise den Aufbau dieser Verbindungszeichenfolge, so dass wir nicht auf ein Format setzen die Zeichenfolge geschrieben ist seine Art zu bestimmen, und ich würde bevorzugen nicht alle Kombinationen und Permutationen der möglichen Verbindung zu haben, Code auf Strings

War es hilfreich?

Lösung

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

Andere Tipps

wenn Sie mit Framework 2.0 oder höher, und Sie können sie in einem zweiten String mit der Fahrer-Klasse übergeben, können Sie die DbProviderFactory-Klasse verwenden Sie den Treiber zu laden.

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

Hier ist ein MSDN Link auf die Factory-Klasse: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

Sie sollten Lage sein, den Provider Abschnitt zu analysieren und sie in DbProviderFactories.GetFactory passieren, die eine OdbcFactory, OleDbFactory oder SqlClientFactory zurück und lassen Sie dann ausführen Create etc.

Ich bin mir nicht sicher, wie dies mit Oracle funktionieren würde, wenn sie eine OracleDbFactory liefern.

Die Verbindungszeichenfolgen (zumindest in .NET 2.0) haben auch eine provider Eigenschaft, die mit ihnen geht. So eine SQL-Verbindungszeichenfolge einen Provider-Namen haben wie:

providerName="System.Data.SqlClient"

So Ihre Methode müßte sowohl die Verbindungszeichenfolge und den Namen des Anbieters akzeptieren und dann könnten Sie die DbProviderFactory verwenden wie damieng erwähnt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top