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

Bases de données Delphi Discussion :

[SQL Server]Recupération du résultat d'une procédure stockée


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut [SQL Server]Recupération du résultat d'une procédure stockée
    Bonjour !

    Je réalise un projet sous Delphi avec une base de données en SQL server.
    J'appelle une procedure stockée qui insère une commande (voir ici : http://www.developpez.net/forums/viewtopic.php?t=319037 ), et j'aimerais la récupérer dans une variable w_id_cde :

    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
    procedure TfrmNewCde.btValiderCdeClick(Sender: TObject);
    var
        w_id_cde:int64;    // shortint
    begin
     
              // procédure d'insertion d'une commande
              procInsertCde.Close;
              procInsertCde.Parameters.ParamByName('@date').Value := txtDateCde.DateTime;
              procInsertCde.Parameters.ParamByName('@etat').Value := cb_etat_cde.Text;
              procInsertCde.Parameters.ParamByName('@montant').Value := txtMontantCde.Text;
              procInsertCde.Parameters.ParamByName('@acompte').Value := txtAcompteCde.Text;
              procInsertCde.Parameters.ParamByName('@no_client').Value := txtNumCli.Text;
              procInsertCde.Parameters.ParamByName('@id_cde').Value := w_id_cde;
              procInsertCde.ExecProc;
     
              showmessage(inttostr(w_id_cde));
     
     
    end;
    Or , le showmessage me renvoit 0 alors que sous sql server cela me renvoit la bonne valeur insérée...
    Je précise que mon paramètre @id_cde est de type tinyint... Je ne sais pas quel est son type correspondant sous delphi.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Salut!

    Dans SQL Server, je suppose (je ne connais les procédures stockées qu'avec Interbase ) qu'on utilise @ pour exprimer qu'une variable est un paramètre. Essaie de retirer ce symbole et reteste le code.

    A+

  3. #3
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    Salut !

    J'ai essayé en enlevant le @ mais le débogueur dit que ce paramètre n'existe pas car il faut bien mettre le @ devant le nom du paramètre.

    Ce que je ne comprends pas, c'est comment récupérer ce paramètre en sortie alors qu'il marche bien avec l'analyseur de requête sous SQL Server...

    Y a-t-il un moyen d'y arriver ?...

    Merci d'avance.

  4. #4
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Ah ok! c'est maintenant que je (crois) comprendre
    je pense que ceci devrait marcher (utilisé avec TADOStoredProc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    w_id_cde := procInsertCde.Parameters.ParamValues['@RETURN_VALUE']);
    Et pour retourner un ensemble de valeur, tu passes par l'objet RecordSet du TADOStoredProc.

    Je te ferai remarquer que tu n'as pas donné de valeur à w_id_cde (cà ne pouvait pas se remplir tout seul)

    A+

  5. #5
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    En effet j'utilise bien un TADOStoredProc.

    J'ai pris le code que tu m'as proposé et le débogueur dit qu'il ne connait pas le paramètre @RETURN_VALUE.

    Voici mon nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procInsertCde.Close;
              procInsertCde.Parameters.ParamByName('@date').Value := txtDateCde.DateTime;
              procInsertCde.Parameters.ParamByName('@etat').Value := cb_etat_cde.Text;
              procInsertCde.Parameters.ParamByName('@montant').Value := txtMontantCde.Text;
              procInsertCde.Parameters.ParamByName('@acompte').Value := txtAcompteCde.Text;
              procInsertCde.Parameters.ParamByName('@no_client').Value := txtNumCli.Text;
              procInsertCde.Parameters.ParamByName('@id_cde').Value := w_id_cde;
              procInsertCde.ExecProc;
     
     
              w_id_cde := procInsertCde.Parameters.ParamValues['@RETURN_VALUE'];
     
              showmessage(inttostr(w_id_cde));
    Où est mon erreur ?

    PS : le paramètre @RETURN_VALUE est bien présent dans ma procédure stockée.

  6. #6
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut Re: Récupération d'un paramètre en sortie
    Citation Envoyé par navis84
    procInsertCde.Parameters.ParamByName('@id_cde').Value := w_id_cde;
    procInsertCde.ExecProc;

    showmessage(inttostr(w_id_cde));


    end;[/code]
    Après une relecture du code initial.
    > Le paramètre w_id_cde vaut 0 (est-ce la bonne valeur à envoyer)
    > Je suppose que tu as correctement renseigné le nom de la procédure.
    PS : le paramètre @RETURN_VALUE est bien présent dans ma procédure stockée.
    Comment cà ? Il ne doit pas être normallement présent dans la procédure stockée Enfin d'après mes connaissances. C'est un paramètre (je dirai automatique) qui contient la valeur de retour de la procédure; donc tu dois avoir un RETURNS dans ta procédure :

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE FUNCTION UneFonction ()
    RETURNS INTEGER AS
    BEGIN
      DECLARE @ParamARetourner INTEGER
    //Code
        RETURN @ParamARetourner
    END
    Tu pourrais poster le code de la procédure stp.

    A+

  7. #7
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    Désolée, j'ai du mal m'exprimer...

    Voici ma procédure stockée sous 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
    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
    CREATE PROC ps_InsertCde
    (
    	@date datetime = null,
    	@etat varchar(10) = null,
    	@montant numeric(10,2) = null,
    	@acompte numeric(10,2) = null,
    	@no_client tinyint = null,
    	@id_cde tinyint OUTPUT
    )
    AS
     
    /* Test si la date est vide */
    IF @date IS NULL
    BEGIN
    	raiserror('Insertion impossible : la date de commande n''a pas été renseignée.', 16, 1)
    	return
    END
     
    /* Test si l'état est vide */
    IF @etat IS NULL
    BEGIN
    	raiserror('Insertion impossible : l''état de la commande n''a pas été renseigné.', 16, 1)
    	return
    END
     
    /* Test si le montant est vide */
    IF @montant IS NULL
    BEGIN
    	raiserror('Insertion impossible : le montant de la commande n''a pas été renseigné.', 16, 1)
    	return
    END
     
    /* Test si l'acompte est vide */
    IF @acompte IS NULL
    BEGIN
    	raiserror('Insertion impossible : l''acompte de la commande n''a pas été renseigné.', 16, 1)
    	return
    END
     
    /* Test si la date est vide */
    IF @no_client IS NULL
    BEGIN
    	raiserror('Insertion impossible : le numéro du client n''a pas été renseigné.', 16, 1)
    	return
    END
     
    /* On insère la commande */
    INSERT INTO commande(date_cde, etat_cde, montant, acompte, no_client)
    VALUES(@date, @etat, @montant, @acompte, @no_client)
     
    SELECT @id_cde = @@IDENTITY
    SELECT @id_cde
    Ensuite, sous Delphi, j'ai mis un TADOStoredProc relié à cette procédure stockée.
    Il possède comme paramètres tous ceux de la procédure stockée ainsi que le fameux @RETURN_VALUE qui est mis automatiquement.
    Je n'ai rien changé quant aux paramètres dans le TADOStoredProc.

    Et mon code sous Delphi pour récupérer le paramètre en sortie est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procInsertCde.Close; 
              procInsertCde.Parameters.ParamByName('@date').Value := txtDateCde.DateTime; 
              procInsertCde.Parameters.ParamByName('@etat').Value := cb_etat_cde.Text; 
              procInsertCde.Parameters.ParamByName('@montant').Value := txtMontantCde.Text; 
              procInsertCde.Parameters.ParamByName('@acompte').Value := txtAcompteCde.Text; 
              procInsertCde.Parameters.ParamByName('@no_client').Value := txtNumCli.Text; 
              procInsertCde.Parameters.ParamByName('@id_cde').Value := w_id_cde; 
              procInsertCde.ExecProc; 
     
     
              w_id_cde := procInsertCde.Parameters.ParamValues['@RETURN_VALUE']; 
     
              showmessage(inttostr(w_id_cde));
    Ma procédure stockée est elle correcte étant donnée qu'elle marche sous SQL Server ou dois-je changer quelque chose dans mon code sous Delphi ?

    Merci d'avance pour votre aide.

    PS : cela ne doit pas retourner 0 car le numéro de la commande est supérieur à 0, d'où le problème...

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    il te manque juste un

    dans ta procedure stockée.

    Si tu veux recupérer un resultat, tu dois faire un return sinon
    @RETURN_VALUE te retournera 0 à chaque fois (Valeur par défaut).

    De plus je te conseil d'encadré ta commande insert d'un system de transaction pour le cas ou il y est un problème lors de l'insertion dans la db.

  9. #9
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 533
    Points : 313
    Points
    313
    Par défaut
    En mettant le nom de mon paramètre en sortie (voir ci dessous), cela marche très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procInsertCde.Parameters.ParamValues['@id_cde'];
    Mais ta réponse m'a permis de mieux comprendre le RETURN_VALUE. Je compte aussi rajouter des transactions.

    Merci beaucoup pour votre aide !
    @+

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

Discussions similaires

  1. [SQL SERVER] Utilisation résultat d'une procédure stockée
    Par hwoarang dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/09/2010, 11h14
  2. [SQL-SERVER] Définir la BD d'une procédure stockée
    Par Sytchev3 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/03/2006, 11h40
  3. Problème de récup de résultats d'une procédure stockée
    Par an_merle dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 12/01/2006, 10h08
  4. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  5. [C#] Récupérer le résultat d'une procédure stockée
    Par fabrice1596 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/10/2004, 13h45

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