2010-01-06 10 views
3

Je suis en train de développer un simple acesseur de base de données pour un système, mais j'ai besoin de supporter 2 bases de données, PostgreSQL et Oracle (XXg);Gestionnaires de connexion Agnostic dans .NET

Un exemple serait comme celui-ci (qui travaillent déjà pour pgsql)

... bunch of properties, constructors and fields 

private String BuildConnectionString(); 

public Int32 ExecuteNonQuery(NpgsqlCommand sqlCommand); 

public NpgsqlDataReader ExecuteQueryReader(NpgsqlCommand sqlCommand); 

public Object ExecuteScalar(NpgsqlCommand sqlCommand); 

Je me demandais s'il est possible de construire une classe pour gérer ces deux bases de données en utilisant uniquement des interfaces System.Data, comme IDataReader, IDbConnection Je pense que c'est le cas, mais je suis coincé quand j'ai besoin d'utiliser la connexion. Exemple:

public PgSqlConnectionHandler(String username, String password, 
       String database, String server, Int32 port) 
    { 
     this._username = username; 
     this._password = password; 
     this._database = database; 

     this._server = server; 
     this._port = port; 

     this._connection = new NpgsqlConnection(BuildConnectionString()); 
    } 

Dans l'autre cas, je serais (_connection est typeof (IDbConnection):

public AgnosticConnectionHandler(String userName, String password, 
       String database, String server, Int32 port) 
    { 
     this._userName = userName; 
     this._password = password; 
     this._database = database; 
     this._server = server; 
     this._port = port; 

     this._connection = ???? 
    } 

Y at-il un moyen rapide de faire

Ce sont des demandes de base de données simples? , je ne ai pas besoin de rien de fantaisie, il est un petit système.

Merci pour votre attention!

Répondre

2

Utilisez le motif d'usine pour créer votre connexion à la base de données. Par exemple, vous disposez d'une méthode statique qui crée une connexion dans laquelle vous spécifiez le type et toutes les informations pertinentes, et renvoie l'interface (IDbConnection) (mais correctement typée dans sa construction).

Le cœur de cette méthode serait probablement une instruction if qui renvoyait la connexion Oracle ou Postgre.

+0

Cela a fonctionné. Merci et merci à tous ceux qui ont aidé;) –

2

Vous pouvez utiliser l'interface IDbConnection et créer une fabrique pour créer les classes concrètes. À partir de cette interface, vous pouvez ensuite créer IDbCommands et attacher les paramètres appropriés et les exécuter pour obtenir DataReaders ou DataSets. J'ai déjà fait ça avant pour faire de l'effet.

2

Vous pouvez également utiliser le fournisseur de données OleDb, car les deux bases de données ont des fournisseurs OLEDB. Sinon, vous aurez toujours ODBC, pour le meilleur ou pour le pire.

alt text http://i.msdn.microsoft.com/Ee817654.f01daag02(en-us,PandP.10).gif

+0

C'est intéressant, car cela simplifierait la plupart des problèmes que j'ai ici. Je vais y réfléchir, merci. –