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