Frage

Wie konstruieren Sie ein DbConnection basierend auf einem Provider-Namen

Beispiel Providername s

  • System.Data.SqlClient
  • System.Data.OleDb
  • System.Data.Odbc
  • FirebirdSql.Data.FirebirdClient

i-Verbindungszeichenfolgen in meinem IIS-Server web.config-Datei gespeichert haben:

<connectionStrings>
  <add name="development"
        connectionString="Provider = IBMDA400; Data Source = MY_SYSTEM_NAME; User Id = myUsername; Password = myPassword;" 
        providerName="System.Data.OleDb" />
  <add name="live" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.Odbc" />
  <add name="testing" 
        connectionString="usd=sa;pwd=password;server=deathstar;" 
        providerName="System.Data.SqlClient" />
  <add name="offline"
        connectionString="Server=localhost;User=SYSDBA;Password=masterkey;Charser=NONE;Database=c:\data\mydb.fdb"
        providerName="FirebirdSql.Data.FirebirdClient"/>

Sie können sehen, dass sie alle verschiedene Anbieter nutzen. Wenn es Zeit wird für mich eine Verbindung zu schaffen, muß ich wissen, welche Art von DbConnection zu schaffen, z.

  • SqlConnection
  • OleDbConnection
  • OdbcConnection
  • FbConnection

Die connection Einträge enthält ein provider , aber diese sind nicht die Namen der DbConnection abgeleiteten Klassen, aber zu sein scheinen ein Namespace

Wie schalte ich ein DbConnection Konstrukt basiert auf einer Zeichenfolge provider


public DbConnection GetConnection(String connectionName)
{
    //Get the connectionString infomation
    ConnectionStringSettings cs = 
          ConfigurationManager.ConnectionStrings[connectionName];
    if (cs == null)
       throw new ConfigurationException("Invalid connection name \""+connectionName+"\");

    //Create a connection based on the provider
    DbConnection conn = new DbConnection();

}
War es hilfreich?

Lösung

Wenn Sie diesen Weg gehen, ich glaube, Sie werden die DbProviderFactories Klasse verwenden möchten, einen DbProviderFactory zu erhalten, die Sie verwenden können, um die Verbindung aufzubauen. Ich habe den Code nicht ausprobiert, aber ich denke, es wird funktionieren. Es ist möglich, dass Sie nach oben schauen müssen, um den Namen des Anbieters die GetFactoryClasses Methode auf der DbProviderFactories-Klasse und die Invariantname verwenden.

public DbConnection GetConnection(String connectionName)
{
   //Get the connection string info from web.config
   ConnectionStringSettings cs= 
         ConfigurationManager.ConnectionStrings[connectionName];

   //documented to return null if it couldn't be found
   if (cs == null)
      throw new ConfigurationErrorsException("Invalid connection name \""+connectionName+"\"");

   //Get the factory for the given provider (e.g. "System.Data.SqlClient")
   DbProviderFactory factory = 
         DbProviderFactories.GetFactory(cs.ProviderName);

   //Undefined behaviour if GetFactory couldn't find a provider.
   //Defensive test for null factory anyway
   if (factory == null)
      throw new Exception("Could not obtain factory for provider \""+cs.ProviderName+"\"");

   //Have the factory give us the right connection object      
   DbConnection conn = factory.CreateConnection();

   //Undefined behaviour if CreateConnection failed
   //Defensive test for null connection anyway
   if (conn == null)
      throw new Exception("Could not obtain connection from factory");

   //Knowing the connection string, open the connection
   conn.ConnectionString = cs.ConnectionString;
   conn.Open()

   return conn;
}

Andere Tipps

Schauen Sie sich diesem Hanselman Blog auf das Hinzufügen von benutzerdefinierten Typen für unterschiedliche Verbindungszeichennamen bauen , es sieht aus wie kann es passen, was man in einer anderen Art und Weise erreichen will als den Provider-Typen verwendet wird.

Wenn die provider für die jeweilige Verbindungsnamen (dev, test, prod) ändert sich nie Warum kann man einen Schalter auf der connection param für Ihre Methode zu tun und die provider Instanz auf diese Weise eingestellt?

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