IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ADO.NET Discussion :

[C#] Classe générique pour utilisation d'une base de données


Sujet :

ADO.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut [C#] Classe générique pour utilisation d'une base de données
    Bonjour, Je suis actuellement en train de faire un programme sous Visual Studio et j'aimerais pourvoir y gérer la connexion à différentes bases de données (MySQL, Oracle, SQL Server, SQL Server CE) mais cela de manière transparente au niveau de l'utilisation.
    J'aimerais avoir une classe "chapeau" qui choisit automatiquement la sous-classe à utiliser en fonction d'un paramètre. Il y aura une sous classe pour chaque type de base de données. N'ayant pas fait de programmation objet depuis un moment, j'ai un peu de mal à me remettre dans le bain. J'avais pensé faire une classe mère qui contiendrait les paramètres et qui s'occuperait de "choisir" quelle classe fille utiliser mais je ne sais plus si cela est possible.
    Voici ci-dessous un exemple de ce j'ai essayé de faire avec pour le moment une seule des sous-classes.

    Je suis ouvert à toute solutions possibles et possible avec Visual Studio 2012 Ultimate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlServerCe;
    using System.Data.SqlClient;
     
    namespace Database
    {
        enum DbType
        {
            SqlServCe = 0,
            SqlServ = 1,
            Oracle = 2,
    		MySQL = 3
        }
     
    	public class Database
        {
            /** \brief Nom du fichier servant de base de données */
            protected string filename;
     
            /** \brief Hôte de connexion a la base de données */
            protected string host;
     
            /** \brief Port de connexion a la base de données */
            protected int port;
     
            /** \brief Utilisateur de la base de données */
            protected string user;
     
            /** \brief Mot de passe pour la connexion a la base de données (mot de passe utilisateur) */
            protected string password;
     
            /** \brief Langue par défaut utilisée pour la base de données */
            protected string lcid = "1036";
     
            /** \brief Liste des immatriculations */
            protected List<string> listImmat;
     
            /** \brief Présence d'une encryption sur la base de données */
            protected bool encrypt = true;
     
            private SqlCeDB sqlCeDB;
     
            /** \brief Constructeur par recopie */
            public Database(string _host, string _name, int _port, string _user, string _pass)
            {
                this.filename = _name;
                this.host = _host;
                this.port = _port;
                this.user = _user;
                this.password = _pass;
            }
     
            /** \brief Constructeur par recopie pour la création d'une base de données locale */
            public Database (string _name, string _pass )
            {
                this.filename = _name;
                this.password = _pass;
            }
     
            /** \brief Creation de la base de données */
            public virtual void Create ()
            { }
     
            /** \brief Connexion a la base de données */
            public virtual void Connect ()
            { }
     
            /** \brief Fermeture de la connexion à la base de données */
            public virtual void Close ()
            { }
        }
     
        /**
         * \brief Classe gérant les connexion et utilisation d'une base de données SQL Server Compact (locale)
         */
        public class SqlCeDB : Database
        {
            /** \brief Connection utilisée pour accéder à la base de données */
            private SqlCeConnection conn = null;
     
            /** \brief Informations de connexion */
            private string connString;
     
            /** \brief Constructeur */
            public SqlCeDB(string _host, string _name, int _port, string _user, string _pass)
                : base(_host, _name, _port, _user, _pass)
            {
                connString = "Data Source = '" + filename + "'; LCID=" + lcid + "; Password = " + password + "; Encrypt = " + encrypt + ";";
            }
     
            /** \brief Constructeur */
            public SqlCeDB ( string _name, string _pass )
                : base(_name, _pass)
            {
                connString = "Data Source = '" + filename + "'; LCID=" + lcid + "; Password = " + password + "; Encrypt = " + encrypt + ";";
            }
     
            /** \brief Création d'une base de données locale de type SQL Serveur Compact */
            public override void Create()
            {
    		if (Properties.Settings.Default.DbType == ((int) DbType.SqlServCe))
    		{
                    	SqlCeConnection connect = new SqlCeConnection();
    			try
    			{
    				// Création de la base de données
    				SqlCeEngine engine = new SqlCeEngine(connString);
    				engine.CreateDatabase();
    				engine.Dispose();
     
    				// Connection à la base de données
                        		connect.ConnectionString = connString;
    				connect.Open();
     
    				// Creation des tables
    				SqlCeCommand cmd = connect.CreateCommand();
    				cmd.CommandText = "CREATE TABLE Table1 (id int IDENTITY(1,1) PRIMARY KEY, data1 ntext, data2 ntext, data2 ntext)";
    				cmd.ExecuteNonQuery();
    				cmd.CommandText = "CREATE TABLE Table2 (id int IDENTITY(1,1) PRIMARY KEY, id_table1 int, data ntext, date datetime)";
    				cmd.ExecuteNonQuery();
    			}
    				catch (Exception ex)
    			{
    				throw new Exception("Erreur lors de la création de la base de données locale:" + ex.Message);
    			}
    			finally
    			{
    				connect.Close();
    			}
    		}
            }
     
            /** \brief Ouverture d'une connexion à la base de données */
            public override void Connect()
            {
            	if ( Properties.Settings.Default.DbType == ( (int)DbType.SqlServCe ) 
    		{
    			try
    			{
    				// Connection à la base de données
    				conn = new SqlCeConnection(connString);
    				conn.Open();
    			}
    			catch
    			{
    				throw new Exception("Erreur lors de la connexion à la base de données locale.");
    			}
    			/*finally
    			{
    				conn.Close();
    			}//*/
                    }
            }
     
            /** \brief Fermeture de la connexion */
            public override void Close()
            {
                    if (Properties.Settings.Default.DbType == ( (int)DbType.SqlServCe))
    	        {
    			// On vérifie l'état de la connexion avant de la fermer
    			if (conn.State != System.Data.ConnectionState.Closed)
                            {
                                    conn.Dispose();
    				conn.Close();
                            }
                    }
            }
        }

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Le Framework .NET fourni déjà tout l'outillage nécessaire pour cela Je t'invite à te documenter par ici : Writing Provider-Independent Code in ADO.NET ou encore ici : Database Factory Using C# Generics.

    En très gros, ça consiste à manipuler des interfaces telles que IDbConnection, IDbCommand, etc., ou d'utiliser les classes de base DbConnection, DbCommand, etc. et souvent en utilisant le pattern Factory.

    [EDIT] Sinon, les ORM tels qu'Entity Framework gèrent cela eux-même comme des grands (ou presque)
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Voir aussi ce tuto (en français)
    http://johannblais.developpez.com/tu...acces-donnees/

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2008
    Messages : 53
    Points : 44
    Points
    44
    Par défaut
    Merci pour ces liens, j'avais commencé à chercher mais il y tellement de chose possible que je ne savais où m'orienter précisément. je regarde ces liens et passe le sujet en résolu puisque des recherches plus poussées maintenant me permettront (normalement) de m'en sortir.

    Merci encore de vos réponses rapides.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Généralités] [WD19] Conseils pour utiliser nativement une base SQL autre que HyperFile
    Par EriCstoFF dans le forum WinDev
    Réponses: 20
    Dernier message: 24/04/2014, 12h05
  2. Réponses: 4
    Dernier message: 12/04/2011, 10h38
  3. Demande de solution pour utilisation d'une base de données en reseau
    Par Virtualité dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/08/2008, 19h08
  4. Utilisation d'une base de données a distance
    Par newbie57 dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/10/2005, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo