C# - Une classe Générique de connexion de base de données, de commande, lecteur
Suppose que je suis en train de concevoir une classe qui peut gérer n'importe quelle technologie de base de données pour créer une connexion, exécutez la commande et de récupérer des données, etc.
Si j'ai besoin de créer une base de données générique de la manipulation de classe pour les Sgbdr (comme SQL Server, Oracle, FireBird, et.), qui .net abstrait-classe/Interface devrais-je utiliser {DbConnection, DbCommand, DbParameter,...} ou {IDbConnection, IDbCommand IDbParameter,...}?
Dois-je utiliser le code comme
public bool CreateConnection(DatabaseTypeEnum type)
{
DbConnection conn ;
if(type==DatabaseTye.Oracle)
{
//....
}
}
public DbDataReader GetData()
{
DbCommand comm;
//...
}
ou,
public bool CreateConnection(DatabaseTypeEnum type)
{
IDbConnection conn ;
if(type==DatabaseTye.Oracle)
{
//....
}
}
public IDbDataReader GetData()
{
IDbCommand comm;
//...
}
Et, Pourquoi?
Êtes-vous meanig à se poser: Quand dois-je créer un générique ...? et pourquoi?
Veuillez consulter les mises à jour question.
Il est recommandé de programme à l'aide de l'Interface et non pas l'exacte mise en œuvre. Donc, dans vos codes, la 2ème option est préférable. Discussion similaire a été discutée dans le Débordement de la Pile : stackoverflow.com/questions/383947/... stackoverflow.com/questions/570302/when-are-interfaces-needed
Être prudent sur l'utilisation du mot "Générique" pour parler de C#, car elle a un sens très précis sans rapport avec cette question.
Veuillez consulter les mises à jour question.
Il est recommandé de programme à l'aide de l'Interface et non pas l'exacte mise en œuvre. Donc, dans vos codes, la 2ème option est préférable. Discussion similaire a été discutée dans le Débordement de la Pile : stackoverflow.com/questions/383947/... stackoverflow.com/questions/570302/when-are-interfaces-needed
Être prudent sur l'utilisation du mot "Générique" pour parler de C#, car elle a un sens très précis sans rapport avec cette question.
OriginalL'auteur user366312 | 2009-07-10
Vous devez vous connecter pour publier un commentaire.
Ermm... totalement différentes question 🙂
OK, ni...
Vous allez violer Ouvrir Fermer Principe quand vous faites ça... Le commutateur /si l'instruction dans ce lieu particulier est de me faire mal à l'aise :).
Je quitterais la création d'une Usine de classe et de votre code doit se soucient pas si elle est en train de parler à un Serveur SQL server ou DB2 ou Oracle ou quoi que ce soit.
Idéalement, votre code ne doit parler à IDbConnection, IDbCommand, etc. ou de la classe de base abstraite (DbConnection, DbCommand, etc.). Parfois je trouve que vous avez besoin de sortie à un fournisseur en particulier tho (comme SqlDataReader pour l'utilisation de méthodes spécifiques), mais il est assez rare.
L'Usine va encapsuler ce commutateur /si l'instruction à un seul endroit, donc il est facilement maintenable. Vous pouvez résumé de la création actuelle dans une application.config. Donc dans app.config vous choisissez quel type de DB backend que vous soutenez et l'Usine va le ramasser à partir de là et de créer de la bd des choses pour vous.
Voir: cette. Lisez à propos de la Création de DbProviderFactory et la Connexion de la partie...
OriginalL'auteur Jimmy Chandra
Pourquoi n'utilisez-vous pas les génériques?
Vous pouvez définir votre classe comme ceci par exemple:
C'est ce que je fais et c'est vraiment facile à entretenir.
Vous n'avez pas besoin d'Y type de paramètre ici depuis DbCommand peut être instancié à partir de la connexion de l'objet, comme dans le connecticut.CreateCommand(). Aussi qu'est-ce que W type de paramètre?
OriginalL'auteur Ricardo
Vous devez utiliser le
IDbConnection
etIDbCommand
depuis différents fournisseurs de bases de données différentes qui ont de la mise en œuvre des interfaces (pour leur ADO.NET chose), mais mieux pas exactement comme vous l'avez posté. Vous devriez plutôt faire de l'ensemble de la classe générique pour soutenir génériqueIDbConnection
etIDbCommand
. Peut-être comme ceci:L'avantage est que vous pouvez passer à cette classe les types que vous souhaitez utiliser pour
DbConnection
etDbCommand
qui sera différent pour MySQL .net connecteur et d'Oracle. Si vous avez une sorte de contrôle de l'extérieur de la classe. Vous pouvez voir à cette question et ma réponse de référence pour une mise en œuvre de base.OriginalL'auteur nawfal