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

C# Discussion :

Architecture et classes avec l'utilisation d'SqlDataReader


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut Architecture et classes avec l'utilisation d'SqlDataReader
    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):

    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 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.

    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

  2. #2
    Membre actif
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2016
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 154
    Points : 268
    Points
    268
    Par défaut
    bonjour mon cher.
    voici un lien qui pourrait t'aider.https://www.developpez.net/forums/d5...sqlconnection/

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Merci, je vais voir, mais en terme de conception de classe...qu'en penses tu ? J'aurai bien aimé un bon exemple d'une bonne architecture
    Encore merci

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    tu as mis toutes les réponses dans tes questions
    Du coup je sais pas bien ce que tu attends de nous ...
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Ah lol
    Donc déja, stocker le result du DataReader en Dataset set que je passe par référence, ce serait l'idée ?
    Je pensais que le dataset s'était surtout pour des opérations complexes ou affichage dans un datagrid.

    Et pour la connexion je vais voir alors ! merci

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Explication rapide :
    - un DataSet est une sorte de gros tableau qui contient toutes les lignes retournées par ta requête,
    - un DataReader est un simple curseur sur la ligne courante du parcours des résultats de ta requête.

    Le premier te donne donc l'avantage de faire des aller/retours dans tes résultats,
    le second a l'avantage de pas pourrir complètement la mémoire de la babasse si la requête renvoie whatmil lignes.
    Perso je passe toujours par des DataReader.

    Pour le cycle de vie de la connexion avec des DataReader, ta classe pourrait proposer des fonctions connect/disconnect. Comme ça c'est l'utilisateur qui choisira s'il veut ouvrir la connexion une fois pour toute (et fermer en fin de programme), ou ouvrir/fermer autours de chaque requête.
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Alors, pour la connexion il faut créer un pool de connexion ! Reste a voir si je peux le faire avec mySQL.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est le datatable qui stocke les données, le dataset peut stocker plusieurs datatable
    en outre datatable et dataset peuvent etre utilisés avec un adataadapter pour renvoyer les modifs en créant des requetes insert/update/delete automatiquement
    mais bon ca reste des objets de débutant

    il n'est pas forcément judicieux de fermer la connexion avant de sortir de l'execute
    car un classe encapsulant l'accès aux données c'est pratique, ca permet ensuite de faire des tas de choses
    une des utilisations possible c'est de décomposer l'exécution en plusieurs requetes pour faire certains traitements, à fortiori s'ils ont des paramètres variables sur plusieurs tours
    auquel cas on peut des fois commencer par begin tran ou use telle base
    puis faire quelques if en c# et enchainer sur des select ou autre
    et là si tu fermes la connexion entre chaque execute tu pers cette fonctionnalité (une fermeture rollback par exemple)

    donc là il faudrait retourner le sqldatareader à l'appelant, et c'est l'appelant qui ferait une boucle dessus
    après ca oblige à implémenter IDisposable (enfin c'est plus propre)
    ce qui permet à l'appelant d'utiliser une boucle using qui fermera la connexion en sortie de bloc


    et le pool de connexion n'a rien à voir dans l'histoire, si mysql est bien fait et que le connecteur mysql pour .net est bien fait ils ont chacun un pool de connexion d'origine
    et même si ce n'est pas le cas ca ne sera pas le seul défaut de mysql, et ca ne sera donc pas le seul défaut non bloquant de mysql
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Problème avec l'utilisation d'une classe
    Par yoshik dans le forum Général Python
    Réponses: 23
    Dernier message: 29/04/2011, 13h36
  2. Réponses: 6
    Dernier message: 18/08/2009, 08h13
  3. Utiliser ses propres classes avec Zend Framework
    Par Adinsx dans le forum Zend Framework
    Réponses: 3
    Dernier message: 28/02/2008, 20h01
  4. [POO] Problème avec l'utilisation de classes.
    Par sekiryou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 18h54
  5. Réponses: 5
    Dernier message: 26/05/2005, 15h40

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