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

VB.NET Discussion :

Fonction qui regroupe les commandes sql


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut Fonction qui regroupe les commandes sql
    Salut,

    Je vais sur un nouveau projet !

    Et la première chose que j'aimerai faire c'est regrouper dans un module une fonction SQL qui s'occupe des " insert, update, delete, et select " et quand j'ai en ai besoin je fais appel à elle et j'envoie des paramètres .

    J'aimerai savoir comment organiser la fonction qui me permettrait de faire ça?

    Est ce que j'envoie juste en paramètre une chaine de caractère qui contient toute la requête ou puis-je faire plusieurs paramètre :

    Le 1er paramètre, reconnaître le type de commande(insert,delete,update)
    Le 2eme paramètre, Le nom de la table
    Le 3eme paramètre, les textbox qui vont remplir les champs
    Le 4eme paramètre, une clause where
    ?

    J'aimerai que ce module soit le plus standart possible et que je puisse l'organiser dans d'autres projets.

    Merci

  2. #2
    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
    ce qui se fait en général c'est une classe (pas un module) pour encapsuler tout ca, avec une fonction d'exécution de requete simple et une fonction d'exécution de requete select (qui retourne le datareader ou les données)

    morceaux d'exemple pour sql server :

    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
     
    public class DataClass
     
      private shared _connectstring = "server=..."
     
      public sub ExecuteNonQuery(requete as string, paramarray params() as system.Data.sqlclient.sqlparameter)
        try
          using c as new sqlclient.sqlconnexion
            c.connectstring = _connectstring
            c.open
            dim cmd as new sqlcommand ' si le command est disposable, utiliser un using comme pour le connection
            cmd.connection = c
            cmd.commandtext = requete
            for each p as sqlparameter in params
              cmd.parameters.Add(p)
            next
            cmd.executenonquery
          end using
        catch ex as exception
          ' la connection n'a pas pu s'établir ou la requete à planté ou timeout ou autre
        end try
      end sub
     
    end class
    pour access c'est l'espace de nom system.Data.oledb et donc le system.Data.oledb.oledbparameter par exemple

    paramarray sert à dire qu'il va y avoir entre 0 et n parametres fournis (donc soit juste donner la requete, soit la possibilité de mettre autant de variable qu'on veut derrière avec des ","
    un dbparameter sert à sécuriser les requetes paramétrées, et d'éviter les bugs ; ca simplifie aussi la lecture de la requete !
    concaténer la requete avec des textbox est plus que déconseillé

    exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim d as new dataclass
    dim paramNom as new data.sqlclient.sqlparameter("@pnom",me.Textbox1.text)
    dim requete as string = "insert into matable (nom) values (@pnom)"
    d.executenonquery(requete,paramNom)
    si tu ne veux pas faire de multithreading, tu peux mettre tes membres en shared, ou utiliser un module

    pour le executenonquery, tu peux faire soit une fonction qui retourne true ou false selon la résultat de l'exécution
    ou encore retourner l'erreur à l'appelant

    pour le executeselect tu peux soit retourner le datareader, et l'appelant boucle dessus, ou encore retourner un datatable, comme ca l'appelant n'a que le code de son traitement !

    ce code peut etre adapté et complété selon tes besoins, tu peux par exemple sur la classe exposer une propriété pour définir le commandtimeout (avec une valeur par défaut) des fois que tu as besoin de l'agrandir dans certains cas


    pour les exception, il convient de les logger afin de pouvoir débugger ton programme facilement (ex.message et ex.stacktrace au moins)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    c'est regrouper dans un module une fonction SQL qui s'occupe des " insert, update, delete, et select "
    Il serait plus judicieux de créer une interface SQL. Et ensuite implémenter cette interface dans chaque objet.
    [Edit]
    Le message précédent et le mien ce sont croisés.
    [/Edit]
    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Ok merci ça correspond totalement à mes besoins, j'en avais pas demandé autant ^^ mais merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Et ensuite pour chaque projet ,j'aurai juste à importer cette classe ou je peux en faire une reference?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    @Pol63

    Ton code rien à redire, mais au niveau modélisation, ne crois tu pas que pouvoir ce connecter à une source de donnée en fonction de l'objet permet une plus grande souplesse qu'avec une classe ? D'où l'interface.

    A+

  7. #7
    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
    Citation Envoyé par champomy62 Voir le message
    Et ensuite pour chaque projet ,j'aurai juste à importer cette classe ou je peux en faire une reference?
    tu peux mettre ca dans une dll avec plein de choses d'autres qui sont génériques à tous tes projets

    dans ce cas par contre il ne faut pas mettre la chaine de connexion en dur, car elle dépendra du projet, il faut alors pouvoir la donner à l'objet
    tu peux par exemple faire un propriété shared ou tu injecteras la chaine de connexion "par défaut" au démarrage de l'appli, et une surcharge du new qui en demande une, des fois que tu ais besoin dans un même programme de te connecter à plusieurs bases


    Citation Envoyé par Geo2A Voir le message
    @Pol63

    Ton code rien à redire, mais au niveau modélisation, ne crois tu pas que pouvoir ce connecter à une source de donnée en fonction de l'objet permet une plus grande souplesse qu'avec une classe ? D'où l'interface.

    A+
    oui, ca dépend de ce qu'on veut faire, si on pouvoir gérer plusieurs types de base de données ou pouvoir migrer la base de son appli il faut faire une classe plus générique (ou une interface) et un factory qui te retourne l'instance du type de base de données que tu souhaites
    mais quand on y réfléchis la syntaxe sql d'une base à une autre n'est pas forcément la même
    ou alors après on passe au niveau au dessus et on fait un classe qui ne demande pas une requete mais qui exprime ce qu'elle veut et la classe génère la requête
    m'enfin au moins on a posé quelques bases d'encapsulation d'accès aux données, à adapter selon les besoins
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Je croyais que le using été utilisé seulement dans c# !?

  9. #9
    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
    using de c# en début de fichier équivaut à imports en vb.net

    le bloc using dans du code sert à disposer les variables disposables
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    merci de ta reponse

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Salut,

    je me posais juste une question par rapport à la fermeture de la connexion...

    Dès que est executé, la connexion est fermée ?

  12. #12
    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
    non

    connection.close ou meme connection.dispose ferme la connexion

    car après un executenonquery, tu peux recharger le commandtext avec une autre requete et refaire un executenonquery
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut

  14. #14
    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
    pour info, certains ne le savent pas, dans le commandtext on peut mettre plusieurs requetes tel une procédure stockée

    exemple pour avoir une clé auto incrément après un insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd.commandtext = "insert into table (ch) values (@v)" & vbcrlf & "select scope_identity()"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [AC-2003] regrouper les commandes de navigation (fonctions?)
    Par minot83 dans le forum IHM
    Réponses: 4
    Dernier message: 13/02/2011, 10h58
  2. Réponses: 4
    Dernier message: 04/05/2007, 22h49
  3. Fonction qui detecte les liens morts
    Par Death83 dans le forum Langage
    Réponses: 9
    Dernier message: 17/10/2006, 18h39
  4. Fonction qui supprime les espaces
    Par Faith's Fall dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/02/2006, 10h29
  5. Comment regrouper les 3requêtes SQL?
    Par SkyDev dans le forum Langage SQL
    Réponses: 16
    Dernier message: 06/03/2004, 13h02

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