Bonsoir à tous,
Je viens ce soir vous demander conseil sur un soucis d'architecture de classe avec l'utilisation des SqlDataXXXXXX ( SqlDataReader,etc...).
Pour faire simple je fais une petite appli C# qui ira effectuer des opérations en base mySQL ( Insert, update, delete, select).
Je me suis fait une classe de base pour gérer ma Db ( la classe ne gère pour le moment que le select):
Mon idée était ensuite de faire différentes classes qui appelleraient cette fonction de lecture et traiteraient ensuite le résultat du SELECT SQL en lisant et itérant sur le SqlDataReader que je passe par référence.
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 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; namespace Bot_UI { class DataBase { private MySqlConnection connection; public string strStringConnect { get; set; } public void InitConnexion() { this.strStringConnect = "SERVER = 127.0.0.1; DATABASE = myDB; UID = root; PASSWORD ="; this.connection = new MySqlConnection(strStringConnect); } public bool ExecuteQuery(string Requete,ref MySqlDataReader myReader) { try { this.InitConnexion(); // Ouverture de la connexion SQL this.connection.Open(); // Création d'une commande SQL en fonction de l'objet connection MySqlCommand cmd = this.connection.CreateCommand(); // Requête SQL cmd.CommandText = Requete; // Exécution de la commande SQL myReader = cmd.ExecuteReader(); // Fermeture de la connexion this.connection.Close(); return true; } catch { return false; // Gestion des erreurs : // Possibilité de créer un Logger pour les exceptions SQL reçus // Possibilité de créer une méthode avec un booléan en retour pour savoir si le contact à été ajouté correctement. } } public DataBase() { } } }
Mon soucis est que je "ferme" la connexion avant de sortir de ma fonction ExecuteQuery(), par conséquent, le reader ne peut plus être lu.
--> Je vois donc une mauvaise architecture de mon modèle. Je suis débutant en C#, en général, comment régler cette problématique de lecture en base si on veut créer une genre de classe "wrapping" pour centraliser les lectures en base ? Ne pas renvoyer de dataReader mais un dataset ?
Je précise que je ne ferai aucun affichage graphique dans un datagrid ou autre...Pas d'interactions de ce genre.
--> Autre question...Comment gérer l'ouverture et la fermeture de la connexion ? On ouvre, on fait la requete et on ferme, ou, on ouvre une fois en début de programme...on fait les requetes ( via des tas de fonctions de différentes....car j'aurai des fonctions de vérifications pour chaque table, et on ferme à la fin). J'ai peur que vu le nombre de requete cela fasse beaucoup de schémar : Ouverture Db, requete, fermeture, ouverture, requete,fermeture,etc...
Je sais que ma question est débutant mais je dois dire que les avis d'expert C# et objets m'intéressent.
Merci à tous
Partager