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 :

ADO Command Object et interaction avec SQL Server


Sujet :

VBScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut ADO Command Object et interaction avec SQL Server
    Hello,

    Voilà, je ne sais pas si je vais vers la bonne direction alors je vais être assez complet.

    Dans un vbscript j'ai donc une connexion ADO (ADODB.Connection) que j'utilisais jusqu'ici avec la méthode Execute pour tapper ma BDD en SQL.
    Problème : certaines erreurs SQL ne sont pas remontées dans l'objet vbscript "err" ni dans la collection ADO cn.errors.

    Donc je suis tombé sur un autre objet ADO : Command qui semble-t-il permet de passer des paramètres de, et vers SQL.
    Mais je n'arrive pas à comprendre comment ça marche...

    voici mon code :
    Code VBS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    set cmddb = WScript.CreateObject("ADODB.Command")
    cmddb.ActiveConnection = cndb
    cmddb.CommandType = 1 'adCmdText pour une requête SQL simple
    cmddb.CommandText = SQLtext 'voir le code SQL plus loin
    cmddb.Parameters.Append cmddb.CreateParameter("@toto", 20, 4) '20 pour adBigInt (mon paramètre sera un entier) 4 pour adParamReturnValue (je veux remonter une info de SQL vers VBS)
     
    set result = cmdsrvstl.Execute
     
    for each objParam in cmddb.Parameters
    	wscript.echo objParam
    next
    Partie SQL j'ai essayé :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare @toto as integer
    set @toto = 12
    Mais à chaque fois mon "wscript.echo objParam" me renvoie un un string vide...

    Comment spécifier au code SQL de renvoyer quelque chose dans mon paramètre "toto" ?

    De plus, si mon code SQL contient plus de 2 opérations, mon recordset de retour n'est pas créé.
    (Par exemple si je fais un UPDATE puis un SELECT dans le même ".Execute", le résultat du SELECT n'arrive pas dans mon recordset "result")

    Merci d'avance pour votre aide

    ** Ce message est aussi posté dans la catégorie SQL Server **

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Partie SQL j'ai essayé :
    Bien, voire ce qu'il faut faire cas par cas.

    [0]
    RETURN 12
    Ce n'est pas possible de faire ça: le script doit montrer un retour d'erreur. Vous pouvez verifier un sql exécuté avec command type text dans IDE. Si c'est valable, vous pouvez travailler avec vbs sans doute, sinon, non plus.

    [1]
    SELECT 12 AS toto
    Pour trouver via vbs, ce n'est pas via adParamReturnValue paramètre, c'est via recordset ou fields, comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQLtext="select 12 as toto"
    cmddb.CommandText = SQLtext 
    cmddb.commandtype=1
    set rs=cmddb.execute
    if not rs.eof then
        wscript.echo rs(0).value
        wscript.echo rs("toto").value
    end if
    [2]
    declare @toto AS integer
    SET @toto = 12
    Le même: pour y trouver quelque chose via vbs, il faut tout de même mettre un select.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQLtext="declare @toto AS integer" & vbcrlf & "SET @toto = 12" & vbcrlf & "select @toto"
    cmddb.CommandText = SQLtext 
    cmddb.commandtype=1
    set rs=cmddb.execute
    if not rs.eof then
        wscript.echo rs(0).value
    end if
    Alors comment faire employer le technique de Paramèters?

    D'abord, si vous utilisiez à la ligne sql, la syntaxe était fausse.
    [1.1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQLtext="select ? as toto"
    cmddb.CommandText = SQLtext 
    cmddb.commandtype=1
    cmddb.parameters.append cmddb.createparameter("x",20,1,8,12)
    set rs=cmddb.execute
    if not rs.eof then
        wscript.echo rs(0).value
        wscript.echo rs("toto").value
    end if
    Encore un example.
    [2.1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQLtext="declare @x Bigint" & vbcrlf & "set @x=?" & vbcrlf & "select @x"
    cmddb.CommandText = SQLtext 
    cmddb.commandtype=1
    cmddb.parameters.append cmddb.createparameter("anyname",20,1,8,12)
    set rs=cmddb.execute
    if not rs.eof then
        wscript.echo rs(0).value
    end if
    Je suis déjà fatigué de mettre tout ça. Pour illustrer l'utilisation de adParamOutput et adParamReturnValue, il faut que vous soyez habile en travaillant sur "stored procedure". Peut-être pour l'autrefois.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut
    Merci pour cette réponse complète.

    Le retour par select dans mon recordset est la première chose que j'ai essayé.

    Malheureusement ma requête effectue d'autres opérations avant le retour, (unpdate / insert), et dans ces cas là, je n'ai pas saisi pourquoi, mais mon recordset de retour n'est pas valable.

    rien que ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE #toto as INT
    SET @toto = 2
    SELECT 12

    Ca me renvoie un recordset fermé (rs.state) alors que simplement SELECT 12 me renvoie les données dont j'ai besoin.

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    ...ma requête effectue d'autres opérations avant le retour...
    Je ne crois pas que on doit travailler contre le logiciel au lieu de travailler avec! Je ne sais quoi dire d'autre.

    Et puis la partie de "rien que ça": montrez le script complet pour ça. Ma réponse etait assez complète pour le couvre, non?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut
    "Rien que ça" : Le code que j'ai mis est le code complet que j'ai testé !
    Si je fais un .Execute avec ce texte SQL de 3 lignes, le RecordSet en retour ne contient pas ma donnée "12".
    Par contre si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 12
    DECLARE @toto as INT
    @toto = 2
    Là ça marche, la méthode Execute ne renvoyait que le premier résultat, "SET @toto = 2" serait alors un résultat...

    Tout ce que je veux, c'est sortir en erreur !
    Je fais un update puis un select pour vérifier si mon update a marché.
    Si ma vérification m'indique une erreur, alors je veux pouvoir forcer une erreur...

    Je ne comprends pas que ça puisse être compliqué T.T

  6. #6
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Vous voulez dire que le code j'ai mis en [2] ne marche pas? Je ne peux plus explicit que cela, le SQLText. (Il peut paraitre select @toto ou select 12, egalement.)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Par défaut
    Effectivement non le code en [2] ne marche pas, le rs n'est pas ouvert.

  8. #8
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Effectivement non le code en [2] ne marche pas, le rs n'est pas ouvert.
    C'est pour ça que j'ai dit
    Et puis la partie de "rien que ça": montrez le script complet pour ça.
    J'ai bien verifié avant de poster même pour ça. Je resente de prolonger une discussion interminable. Pourquoi pas postez un petit script complet pour montrer votre soucis?

Discussions similaires

  1. [Débutant] linq to sql et ado.net avec sql server
    Par karimot dans le forum Linq
    Réponses: 1
    Dernier message: 24/12/2013, 08h48
  2. ADO Command Object et interaction avec SQL Server
    Par BlobbyBlob dans le forum Développement
    Réponses: 0
    Dernier message: 16/01/2012, 18h09
  3. [C#] interactions avec SQL Server 2000
    Par Abydos Business Group dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/05/2007, 12h12
  4. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  5. Déployer une appli avec SQL SERVER
    Par tiboleo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 15/10/2003, 14h29

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