[..] Appel d'une procédure stockée SQLServer avec paramètre

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
AlainG
Niveau 1
Niveau 1
Messages : 3
Enregistré le : sam. 09 juil. 2011 00:45
Status : Hors ligne

[..] Appel d'une procédure stockée SQLServer avec paramètre

#1

Message par AlainG »

Bonjour à tous,

j'ai besoin d'appeler une procédure stockée dans une base SQL Server.
Cette procédure attend un paramètre en entrée, et renvoie 3 valeurs.
J'ai écrit un script Vbs qui fonctionne, et j'essaie de le transcrire en AutoIT.

Le code Vbs est le suivant

Code : Tout sélectionner

    objconn.ConnectionString = "driver={SQL Server};server=ServerName;uid=User;pwd=Pass;database=DB"
    objconn.Open

    Set objCmd = CreateObject("ADODB.Command")
    objCmd.ActiveConnection = objConn
    objCmd.CommandText = "Proc_Name" 
    objCmd.CommandType = 4 'adCmdStoredProc

    'Add Input Parameters
    objCmd.Parameters.Append objCmd.CreateParameter("@UserLogin", adVarChar, adParamInput, 20, strUserLogin)

    ' Exécution de la requête
    Set objRecordSet = objCmd.Execute
 
Le portage en AutoIT donne

Code : Tout sélectionner

    ; Instantiate objects
    $objConn = ObjCreate("ADODB.Connection")
    $objRecordSet = ObjCreate("ADODB.Recordset")

    $objConn.Open("driver={SQL Server};server=ServerName;uid=User;pwd=Pass;database=DB")

    $strSqlQuery = "ProcName " & $strUserLogin
    $objRecordSet.Execute($strSqlQuery,$objConn,$adOpenKeyset,$adLockOptimistic,$adCmdStoredProc)
 
mais l'instruction Recordset.execute s'arrête avec le message suivant :
The requested action with this object has failed

J'ai trouvé des exemples d'appel de procédure mais sans paramètre.

Quelqu'un pour m'aider ?

Help me if you can I'm feeling down
And I do appreciate you being round
Avatar du membre
Strofe
Niveau 5
Niveau 5
Messages : 182
Enregistré le : ven. 26 sept. 2008 23:16
Localisation : Picardie, Oise, Beauvais
Status : Hors ligne

Re: [..] Appel d'une procédure stockée SQLServer avec paramè

#2

Message par Strofe »

Y a pas de problème, y a que des solutions. Reste à les trouver.
AlainG
Niveau 1
Niveau 1
Messages : 3
Enregistré le : sam. 09 juil. 2011 00:45
Status : Hors ligne

Re: [..] Appel d'une procédure stockée SQLServer avec paramè

#3

Message par AlainG »

Bonjour,

merci de ton aide.

J'avais testé quelque chose d'approchant, mais j'avais buté (à posteriori je dirai bêtement) sur le .append
Là, j'ai fait comme décrit dans l'article mais il se bloque sur le Obj.execute : The requested action with this object has failed.

Code : Tout sélectionner

Dim Const $adCmdUnspecified = -1
Dim Const $adCmdText = 1
Dim Const $adCmdTable = 2 
Dim Const $adCmdStoredProc = 4
Dim Const $adCmdUnknown = 8
Dim Const $adCmdFile = 256
Dim Const $adCmdTableDirect = 512

Dim Const $adOpenForwardOnly = 0
Dim Const $adOpenKeyset = 1
Dim Const $adOpenDynamic = 2
Dim Const $adOpenStatic = 3
Dim Const $adOpenUnspecified = -1 

Dim Const $adLockBatchOptimistic =4
Dim Const $adLockOptimistic =3
Dim Const $adLockPessimistic =2
Dim Const $adLockReadOnly =1
Dim Const $adLockUnspecified =-1 

Dim Const $adVarChar = 200
Dim Const $adInteger = 3
Dim Const $adParamInput = 1
Dim Const $adParamOutput = 2

Dim $objConn, $objCmd, $objRecordSet
Dim $strUserLogin, $strPrenomSponsor, $StrNomSponsor, $StrAdrMailSponsor
Dim $strConnexion = "DRIVER={SQL Server};SERVER=serverName;DATABASE=dbName;uid=UserName;pwd=UserPwd"

   $strUserLogin = "UserLogin"

   ; Instantiate objects
   $objConn = ObjCreate("ADODB.Connection")

   ;objconn.ConnectionString = "DRIVER={SQL Server};SERVER=serverName;DATABASE=dbName;uid=UserName;pwd=UserPwd"
   ;$objconn.Open($strConnexion)
   $objconn.Open("DRIVER={SQL Server};SERVER=serverName;DATABASE=dbName;uid=UserName;pwd=UserPwd")

   $objCmd = ObjCreate("ADODB.Command")
   $objCmd.ActiveConnection = $objConn
   ;$objCmd.ActiveConnection = "DRIVER={SQL Server};SERVER=serverName;DATABASE=dbName;uid=UserName;pwd=UserPwd"
   $objCmd.CommandText = "REF_PRC_DROIT_GET_UTILISATEUR_SPONSOR" 
   $objCmd.CommandType = $adCmdStoredProc

   ; Add Input Parameters
   $objCmd.Parameters.Append ($objCmd.CreateParameter("@UserLogin", $adVarChar, $adParamInput, 20, $strUserLogin))

   ; Add Output Parameters
   $objCmd.Parameters.Append ($objCmd.CreateParameter("@PrenomSponsor", $adVarChar, $adParamOutput, 20, $strPrenomSponsor))
   $objCmd.Parameters.Append ($objCmd.CreateParameter("@NomSponsor", $adVarChar, $adParamOutput, 20, $strNomSponsor))
   $objCmd.Parameters.Append ($objCmd.CreateParameter("@eMailSponsor", $adVarChar, $adParamOutput, 60, $StrAdrMailSponsor))

   ; Exécution de la requête
   $objCmd.Execute         <-- ERROR
  
   $strPrenomSponsor = $objCmd.Parameters("@PrenomSponsor").Value
   $strNomSponsor = $objCmd.Parameters("@NomSponsor").Value
   $StrAdrMailSponsor = $objCmd.Parameters("@eMailSponsor").Value

   MsgBox (0, "Test", $strPrenomSponsor)
   MsgBox (0, "Test", $strNomSponsor)
   MsgBox (0, "Test", $StrAdrMailSponsor)    
   
    $objConn.Close
    ;$objConn = Nothing
 
Comme le montrent les différents commentaires, j'ai essayé différents formats de connexion, mais le résultat est toujours le même.
Je vais continuer à creuser mais je reste preneur de conseils.

Help me if you can I'm feeling down
And I do appreciate you being round
AlainG
Niveau 1
Niveau 1
Messages : 3
Enregistré le : sam. 09 juil. 2011 00:45
Status : Hors ligne

Re: [..] Appel d'une procédure stockée SQLServer avec paramè

#4

Message par AlainG »

Ma solution :

Code : Tout sélectionner

Dim Const $adCmdUnspecified = -1
Dim Const $adCmdText = 1
Dim Const $adCmdTable = 2 
Dim Const $adCmdStoredProc = 4
Dim Const $adCmdUnknown = 8
Dim Const $adCmdFile = 256
Dim Const $adCmdTableDirect = 512

Dim Const $adOpenForwardOnly = 0
Dim Const $adOpenKeyset = 1
Dim Const $adOpenDynamic = 2
Dim Const $adOpenStatic = 3
Dim Const $adOpenUnspecified = -1 

Dim Const $adLockBatchOptimistic =4
Dim Const $adLockOptimistic =3
Dim Const $adLockPessimistic =2
Dim Const $adLockReadOnly =1
Dim Const $adLockUnspecified =-1 

Dim Const $adVarChar = 200
Dim Const $adInteger = 3
Dim Const $adParamInput = 1
Dim Const $adParamOutput = 2

Dim $objConn, $objCmd, $objRecordSet
Dim $strUserLogin, $strPrenomSponsor, $StrNomSponsor, $StrAdrMailSponsor
Dim $strConnexion = "DRIVER={SQL Server};SERVER=serverName;DATABASE=dbName;uid=UserName;pwd=UserPwd"

$strUserLogin = "User.Login"

    ; Instantiate objects
    $objConn = ObjCreate("ADODB.Connection")
    $objconn.Open($strConnexion)

    $objCmd = ObjCreate("ADODB.Command")
    $objCmd.ActiveConnection = $objConn
    $objCmd.CommandText = "ProcName" 
    $objCmd.CommandType = $adCmdStoredProc

    ; Add Input Parameters
    $objCmd.Parameters.Append ($objCmd.CreateParameter("@UserLogin", $adVarChar, $adParamInput, 20, $strUserLogin))

    ; Exécution de la requête
    $objRecordSet = ObjCreate("ADODB.Recordset")
    $objRecordSet = $objCmd.Execute

    If $objRecordset.BOF = True OR $objRecordset.EOF = True Then
        MsgBox (0, "Test", "Unexisting user")
    Else
        $strPrenom = $objRecordset.Fields("FirstName").value
        $strNom = $objRecordset.Fields("Name").value
        $StrAdrMail = $objRecordset.Fields("Email").value
    
        If $strPrenom = "" OR $strNom  ="" OR $StrAdrMail = ""  Then
            MsgBox (0, "Test", "Undefined values")
        Else
            MsgBox (0, "Test", $strPrenom)
            MsgBox (0, "Test", $StrNom)
            MsgBox (0, "Test", $StrAdrMail)    
        EndIf
    EndIf

    $objConn.Close

 
Je ne suis pas parvenu à faire fonctionner la version avec des paramètres en sortie :

Code : Tout sélectionner

    $objCmd = ObjCreate("ADODB.Command")
    $objCmd.ActiveConnection = $objConn
    $objCmd.CommandText = "ProcName" 
    $objCmd.CommandType = $adCmdStoredProc

    ; Add Input Parameters
    $objCmd.Parameters.Append ($objCmd.CreateParameter("@UserLogin", $adVarChar, $adParamInput, 20, $strUserLogin))

    ; Add Output Parameters
    $objCmd.Parameters.Append ($objCmd.CreateParameter("@PrenomSponsor", $adVarChar, $adParamOutput, 20))
    $objCmd.Parameters.Append ($objCmd.CreateParameter("@NomSponsor", $adVarChar, $adParamOutput, 20))
    $objCmd.Parameters.Append ($objCmd.CreateParameter("@eMailSponsor", $adVarChar, $adParamOutput, 60))

    ; Exécution de la requête
    $objCmd.Execute

 
Si ça vous tente ;-)

Strofe, merci de ton aide.

Help me if you can I'm feeling down
And I do appreciate you being round
Répondre