2009-06-12 4 views
1

Nous avons 3 fournisseurs de bases de données que nous utilisons pour nous connecter à nos bases de données: DB2, MS SQL et Interbase. Je voudrais créer une classe de wrapper de base de données générique unique qui peut être utilisée pour parler à tous les trois juste en passant la chaîne de connexion correcte, nom d'utilisateur, mot de passe, et le fournisseur souhaité.Est-il possible de créer une classe de base de données commune dans VB.NET?

Je ne veux pas avoir à ajouter des références et importer les trois fournisseurs dans la classe de base de données. Est-ce possible?

Je l'ai déjà fait en Java en utilisant la fonction Class.forName().

Répondre

3

Il y a un abstract factory intégré dans .NET 2.0 ou version ultérieure, un exemple de son utilisation serait:

Dim factory As System.Data.Common.DbProviderFactory 
factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient") 

Dim conn As System.Data.Common.DbConnection = factory.CreateConnection() 
conn.ConnectionString = "connectionString" 
conn.Open() 

Il existe des méthodes sur DbProviderFactory comme CreateCommand, CreateDataAdapter, etc.

0

pouvez-vous utiliser framework 3.5 sp1?

Si oui, vous devriez regarder Linq à l'entité

3

Si vous ne voulez pas avoir des références aux fournisseurs individuels dans votre application, vous devrez gérer cela un peu différemment.

Je vois deux options principales - la première (et la plus simple) serait d'utiliser un framework d'injection de dépendance pour simplement greffer le fournisseur approprié à l'exécution. C'est simple, propre et fonctionne bien.

Vous pourriez le faire vous-même sans cela, cependant. Créez simplement une classe de base à usage général qui fournit l'interface et, pour chaque fournisseur, créez un assembly séparé (donc les références sont séparées) qui implémente cette classe de base. Vous pouvez ensuite utiliser Activator.CreateInstance pour créer une instance du type approprié au moment de l'exécution.

1

Pour développer La réponse de Patrick McDonald, vous pouvez stocker le nom du fournisseur et la chaîne de connexion dans la section < connectionStrings> du fichier de configuration de votre application. Ensuite, vous n'avez pas besoin d'avoir les fournisseurs dans l'application codées en dur:

ConnectionStringSettings c = ConfigurationManager.ConnectionStrings["MyConnectionName"]; 
if (c != null) 
{ 
    DbProviderFactory factory = DbProviderFactories.GetFactory(c.ProviderName); 
    IDbConnection connection = factory.CreateConnection(); 
    connection.ConnectionString = c.ConnectionString; 
    ... 
} 

Si votre fichier de configuration de l'application contient une section connectionStrings quelque chose comme:

<connectionStrings> 
    <add name="MyConnectionName" providerName="System.Data.SqlClient" connectionString="Data Source=serverName;Initial Catalog=DBName;Integrated Security=True"/> 
</connectionStrings>