Question

J'ai une chaîne de connexion transmise à une fonction et je dois créer un objet basé sur DbConnection (c'est-à-dire SQLConnection, OracleConnection, OLEDbConnection, etc.) en fonction de cette chaîne.

Existe-t-il une fonctionnalité intégrée pour ce faire ou des bibliothèques tierces pour vous aider? Nous ne construisons pas nécessairement cette chaîne de connexion, nous ne pouvons donc pas compter sur un format dans lequel la chaîne est écrite pour déterminer son type, et je préférerais ne pas avoir à coder toutes les combinaisons et permutations de connexions possibles. chaînes

Était-ce utile?

La solution

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

Autres conseils

Si vous utilisez Framework 2.0 ou supérieur et que vous pouvez les faire passer dans une deuxième chaîne avec la classe driver, vous pouvez utiliser la classe dbProviderFactory pour charger le pilote à votre place.

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

Voici un lien MSDN vers la classe Factory: http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

Vous devriez être en mesure d’analyser la section Fournisseur et de la transmettre à DbProviderFactories.GetFactory qui renverra un OdbcFactory, OleDbFactory ou SqlClientFactory et vous permettra ensuite d’exécuter CreateConnection, etc.

Je ne suis pas sûr de savoir comment cela fonctionnerait avec Oracle s'il ne fournit pas OracleDbFactory.

La plupart des chaînes de connexion (au moins dans .NET 2.0) possèdent également une propriété providerName qui les accompagne. Ainsi, une chaîne de connexion SQL aura un nom de fournisseur tel que:

providerName="System.Data.SqlClient"

Ainsi, votre méthode devra accepter à la fois la chaîne de connexion et le nom du fournisseur, puis vous pourrez utiliser DbProviderFactory comme mentionné par damieng .

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