Question

Comment construisez-vous une connexion Db sur la base d'un nom de fournisseur ?

Exemple de nom de fournisseur s

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

les chaînes de connexion sont stockées dans le fichier web.config de mon serveur IIS:

<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"/>

Vous pouvez voir qu'ils utilisent tous des fournisseurs différents. Lorsque vient le temps de créer une connexion, je dois savoir quel type de connexion DbConnexion créer, par exemple:

  • SqlConnection
  • OleDbConnection
  • OdbcConnection
  • FbConnection

Les entrées connectionStrings contiennent un nom du fournisseur , mais ces noms ne sont pas les noms des classes descendantes de DbConnection, mais semblent être un espace de noms

.

Comment transformer une structure DbConnection à l'aide d'une chaîne nom du fournisseur ?

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();

}
Était-ce utile?

La solution

Si vous suivez cette route, je pense que vous voudrez utiliser la classe DbProviderFactories pour obtenir une DbProviderFactory que vous pouvez utiliser pour établir la connexion. Je n'ai pas essayé ce code, mais je pense que ça va marcher. Il est possible que vous deviez rechercher le nom du fournisseur à l'aide de la méthode GetFactoryClasses de la classe DbProviderFactories et utiliser InvariantName.

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

Autres conseils

Découvrez ce blog Hanselman sur l'ajout de types de construction personnalisés pour différents noms de chaînes de connexion , il semble que cela puisse correspondre à ce que vous souhaitez accomplir différemment de l’utilisation des types de fournisseur.

Si le nom de fournisseur pour le nom de connexion particulier (dev, test, prod) ne change jamais, vous ne pouvez pas changer le paramètre connectionName pour votre méthode et définir l'instance de fournisseurName de cette manière?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top