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

VBScript Discussion :

Envoyer une requête SQL depuis un VBS


Sujet :

VBScript

  1. #1
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Envoyer une requête SQL depuis un VBS
    Bonjour à toutes et tous,

    Pour des besoins professionnels, je cherche a créer un petit outil basique en VBS permettant à un utilisateur de saisir des données qui seront récupérées dans des variables puis réinjectées dans une requête SQL.

    N'étant pas développeur à la base, je ne suis pas un "pro" du VBS... Disons plutôt que je "bidouille".
    Et il se trouve que le script que j'ai mis en place bloque au moment de retranscrire la requête SQL.

    En fait, je récupère bien les saisies de l'utilisateur dans mes variables, je lance ensuite un CMD utilisant lui-même l'outil mysql.exe permettant de faire des requêtes sur une BDD MySQL.
    Mais c'est là que le bas blesse...

    Le CMD, appelé par mon VBS, refuse de prendre en compte les parenthèses inclues dans ma requête SQL. Résultat : La requête est bancale et ça ne fonctionne pas. Logique.

    Ma question : Auriez-vous plus simple pour requêter sur la BDD directement depuis VBS sans passer par la case CMD (du genre appeler mysql.exe directement en lui passant les paramètres qui vont bien) ? Ou peut-être savez-vous comment je pourrais procéder pour que mes parenthèses soient tout simplement prisent en compte ?

    Merci d'avance de votre aide précieuse !

    Voici le code dans son état actuel :

    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
    Dim UserInput
    On Error Resume Next
    msg01 = msgbox("Bonjour ! Cet utilitaire permet l'ajout d'un client dans la base de données. Désirez-vous continuer ?",4+64+4096,"Ajout CLT BDD")
    If msg01 = 6 Then
    CLT = (InputBox ("Merci d'entrer le numéro du client à ajouter dans la base de données.", "Ajout CLT BDD", "Entrez une valeur à trois chiffres"))
    PVT = (InputBox ("Merci d'entrer maintenant le point de vente de ce client.", "Ajout CLT BDD", "Entrez une valeur à trois chiffres"))
    NOMFAC = (InputBox ("Merci d'entrer maintenant le nom lié à la facture.", "Ajout CLT BDD", "Entrez un nom en lettres majuscules"))
    ADDFAC = (InputBox ("Merci d'entrer maintenant la ville de l'adresse de facturation.", "Ajout CLT BDD", "Entrez une ville en lettres majuscules"))
    NOMLIV = (InputBox ("Merci d'entrer maintenant le nom lié à la livraison.", "Ajout CLT BDD", "Entrez un nom en lettres majuscules"))
    ADDLIV = (InputBox ("Merci d'entrer maintenant la ville de l'adresse de livraison.", "Ajout CLT BDD", "Entrez une ville en lettres majuscules"))
    msg02 = msgbox("Merci. La mise à jour sera effective dans les minutes à venir. Cet utilitaire va maintenant se fermer.",0+64+4096,"Ajout CLT BDD")
    set shellobj = CreateObject("WScript.Shell")
    shellobj.run "cmd"
    wscript.sleep 500
    shellobj.sendkeys "c:\wamp\bin\mysql\mysql5.5.24\bin\mysql.exe -u USER --password=PASS -e ""INSERT INTO 'Nom_DB'.'Nom_Table' ('CLT', 'PVT', 'LIV_NOM', 'LIV_BUR_DISTRIB', 'FAC_NOM', 'FAC_BUR_DISTRIB') VALUES ('"& CLT &"', '"& PVT &"', '"& NOMLIV &"', '"& ADDLIV &"', '"& NOMFAC &"', '"& ADDFAC &"');"" {enter}exit{enter})"
    End If
    If x = 7 Then
    End If
    P.S : Pour info, j'ai testé de lancer la requête à la mano depuis un CMD, ça marche... C'est uniquement lorsque le VBS la réécrit dans le CMD qu'il "omet" les parenthèses...
    J'ai aussi visualisé ma requête via un Wscript.Echo et ça intègre bien mes parenthèses...
    Bref, mystérieux...

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 171
    Points
    17 171
    Par défaut
    Salut

    qu'il "omet" les parenthèses...
    Là ou tu veux que VBScript interprète correctement le littéral parenthèse est non pas comme le début et/ou fin d'une chaine de caractères, remplaces le/les " par son équivalant code ascii, donc Chr(34).
    Tu peux aussi doubler les "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MsgBox Chr(34) & "essais" & Chr(34)
    MsgBox """essais"""
    les 2 syntaxes t'afficheront "essais" (compris les parenthèses).
    Personnellement je trouve plus lisible l'ensemble d'une construction d'une requête par l'emploi de code ascii, à chacun ses petites habitudes.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Salut ProgElecT,

    Merci de ta piste mais malheureusement, même en remplaçant les parenthèses par leur équivalent ascii (à savoir Chr(40) et Chr(41) ) ça ne donne rien... Je pense que le soucis vient de la fonction sendkeys qui ne permet pas d'interpréter les parenthèses dans une fenêtre CMD.
    Il les retire automatiquement...

    Une autre piste peut-être ?

  4. #4
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 171
    Points
    17 171
    Par défaut
    Salut

    Désolé pour la confusion parenthèses et guillemets.
    Autre piste...
    Citation Envoyé par MSDN
    L'instruction SendKeys attribue une signification spéciale au signe plus (+), au signe insertion (^), au signe pourcentage (%), au tilde (~) et aux parenthèses ( ). Pour indiquer l'un de ces caractères, placez-le entre accolades ({}). Par exemple, pour indiquer le signe plus, tapez {+}. Bien que les crochets droits ([ ]) n'aient aucune signification particulière dans l'instruction SendKeys, vous devez les placer eux aussi entre accolades.
    En passant SendKeys "{(}"et/ou SendKeys "{)}"cela devrait faire
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Tu ne veux pas exécuter ta requête "insert" directement par le vbs en utilisant le pilote ODBC qui va bien ?

    Un exemple que j'utilise dans un vbs pour mettre à jour une base Access :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    connstring = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=MaBase.mdb"
    Set Conn = CreateObject("ADODB.Connection")
    Conn.open (connstring)
    txtSQL = "INSERT INTO MATABLE ....."
    Conn.Execute (mySQL)
    Conn.Close
    Set Conn = Nothing
    Tu dois pouvoir remplacer le driver access par quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connstring = "Driver={SQL Server};Server=IpDuServeur\SQLEXPRESS;database=NomDeLaBase;uid=Login;pwd=Password"

  6. #6
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Merci ProgElecT, ça fonctionne nickel en ajoutant les accolades effectivement.

    Salut pc75, effectivement, j'avais pensé à ça mais j’avoue que n'ayant pas de driver ODBC pour MySQL d'installé (MyODBC), j'avais un peu la flemme de regarder du côté de cette option.
    Ceci étant, je vais y jeter un oeil, ça fera plus propre quand même, je vous tiens au courant.

    Je passerais le topic en résolu juste après.

  7. #7
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Re !

    Après avoir trouvé le courage d'installer le pilote et de paramétrer le connecteur ODBC, j'ai fait la modif' sur mon VBS et ça marche nickel.
    C'est plus propre de passer par là et ça évite de switcher sur une commande CMD...

    Pour les intéressés, voici le code final (avec l'option CMD incluse en commentaires) :

    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
     
    Dim UserInput
    On Error Resume Next
    msg01 = msgbox("Bonjour ! Cet utilitaire permet l'ajout d'un client dans la base de données. Êtes-vous sûr de vouloir continuer ?",4+64+4096,"Ajout CLT BDD")
    If msg01 = 6 Then
    wscript.sleep 500
    CLT = (InputBox ("Merci d'entrer le numéro du client à ajouter dans la base de données.", "Ajout CLT BDD", "Entrez une valeur à trois chiffres"))
    wscript.sleep 500
    PVT = (InputBox ("Merci d'entrer maintenant le point de vente de ce client.", "Ajout CLT BDD", "Entrez une valeur à trois chiffres"))
    wscript.sleep 500
    NOMFAC = (InputBox ("Merci d'entrer maintenant le nom lié à la facture (Utiliser des majuscules non accentuées).", "Ajout CLT BDD", "Entrez un nom en lettres majuscules"))
    wscript.sleep 500
    ADDFAC = (InputBox ("Merci d'entrer maintenant la ville de l'adresse de facturation (Utiliser des majuscules non accentuées).", "Ajout CLT BDD", "Entrez une ville en lettres majuscules"))
    wscript.sleep 500
    NOMLIV = (InputBox ("Merci d'entrer maintenant le nom lié à la livraison (Utiliser des majuscules non accentuées).", "Ajout CLT BDD", "Entrez un nom en lettres majuscules"))
    wscript.sleep 500
    ADDLIV = (InputBox ("Merci d'entrer maintenant la ville de l'adresse de livraison (Utiliser des majuscules non accentuées).", "Ajout CLT BDD", "Entrez une ville en lettres majuscules"))
     
    ' Méthode 1 - Connecteur ODBC :
     
    connstring = "DRIVER={MySQL ODBC 5.3 ANSI Driver};Server=IP_Serveur;Data Source=Nom_Connecteur;Database=Nom_DB;User=USER;Password=PASS"
    Set Conn = CreateObject("ADODB.Connection")
    Conn.Open (connstring)
    SQL = "INSERT INTO Nom_DB.Nom_Table (CLT, PVT, LIV_NOM, LIV_BUR_DISTRIB, FAC_NOM, FAC_BUR_DISTRIB) VALUES ('"& CLT &"', '"& PVT &"', '"& NOMLIV &"', '"& ADDLIV &"', '"& NOMFAC &"', '"& ADDFAC &"');"
    Conn.Execute (SQL)
    Conn.Close
    Set Conn = Nothing
     
    ' Méthode 2 - Outil mysql.exe via CMD :
     
    'Set ShellObj = CreateObject("WScript.Shell")
    'ShellObj.Run "cmd"
    'WScript.Sleep 500
    'ShellObj.SendKeys "c:\wamp\bin\mysql\mysql5.5.24\bin\mysql.exe -u USER --password=PASS -e ""INSERT INTO Nom_DB.Nom_Table {(}CLT, PVT, LIV_NOM, LIV_BUR_DISTRIB, FAC_NOM, FAC_BUR_DISTRIB{)} VALUES {(}'"& CLT &"', '"& PVT &"', '"& NOMLIV &"', '"& ADDLIV &"', '"& NOMFAC &"', '"& ADDFAC &"'{)}"" {enter}exit{enter}"
     
    wscript.sleep 500
    msg02 = msgbox("Merci. La mise à jour a été effectuée avec succès. Cet utilitaire va maintenant se fermer. A bientôt !",0+64+4096,"Ajout CLT BDD")
    End If
    If msg01 = 7 Then
    msg03 = msgbox("Aucune mise à jour n'a été effectuée. Cet utilitaire va maintenant se fermer. A bientôt !",0+64+4096,"Ajout CLT BDD")
    End If

    Merci encore de votre aide !

    Topic résolu.

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

Discussions similaires

  1. [MySQL-5.6] Envoyer une requête HTTP depuis MySQL
    Par noemieze dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 13/07/2014, 11h39
  2. Lire une requête SQL depuis un fichier texte
    Par Chris L' Arabis dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 30/05/2014, 19h06
  3. Envoyer une requête SQL par un MultiCastUDP
    Par Eausport dans le forum Général Java
    Réponses: 5
    Dernier message: 20/07/2012, 10h16
  4. Envoyer une requête SQL
    Par guillaume.quest dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/06/2007, 07h52
  5. Générer une requête SQL depuis un model physique
    Par Ryan Sheckler dans le forum Requêtes
    Réponses: 4
    Dernier message: 01/12/2005, 12h11

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