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 :

Procedure stockée et delphi7


Sujet :

Bases de données Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Procedure stockée et delphi7
    Bonjour a tous

    Delphi 7
    SQLServer 2000

    Mon problème :

    J'essaie de monter une procédure stockée qui a pour but d'incrémenté un compteur dans une table et d'aller récupérer ce numéro.

    voici ma procédure stockée :


    Code sql : 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
    CREATE PROCEDURE "SP_GENERATOR" 
    (
      @TABLENOM  D_NOM,
      @AVALUE D_NUMID OUTPUT
     
    )
    as
    begin
        UPDATE TABLE_CPT SET CPT = CPT + 1 WHERE NOM=@TableNom;
        DECLARE C CURSOR
        FOR SELECT CPT 
        FROM   TABLE_CPT 
        WHERE  NOM = @TABLENOM;
     
        OPEN C;
        FETCH C INTO   @AVALUE;
        WHILE @@FETCH_STATUS = 0 BEGIN
           FETCH C INTO   @AVALUE;
        END
        CLOSE C;
        DEALLOCATE C;
    end;
    GO

    Dans delphi voici mon code :


    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
    function GetSQLGenerator(aTableName: string): LongInt;
    var Q : TSQLStoredProc;
    var p1 ,p2 : TPAram;
    begin
       result := -1
       Q := nil;
       with Q do
       try
         Q1 := CreateQueryFmt ('execute SP_GENERATOR %s, %d;',[QuotedSQL(aTableName), result]);
         q := CreateStoredProc('SP_GENERATOR'); // Crée un StoredProc avec un SQLconnexion approprié
         StoredProcName := 'SP_GENERATOR';
         Params.Clear;
         P1 := TParam.Create(Params, ptInput);
         p1.Name := 'TABLENOM';
         Q.ParamByname('TABLENOM').Value := aTableName;
         P2 := TParam.Create(Q.Params, ptInputOutput);
         p2.Name := 'VALUE';
         Q.ParamByname('VALUE').Value := result;
         q.ExecProc;
         result := Q.ParamByname('VALUE').AsInteger;
       finally
         p1.Free;
         p2.Free;
         FreeAndNil(q);
       end;
    end;

    Mon problème est que ma procedure stockée ne renvoie jamais de valeur dans la variable @AVALUE qui est pourtant en OUPUT.

    D'autre part dans l'analyseur de requet SQL , je teste ma procédure...
    mais sans résultat convainquant.

    Code :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
    declare @toto int;
    execute SP_GENERATOR 'ARMATEUR' , @toto;
    print @toto;
    end;

    Ce script ne renvoie jamais rien , or si j'inclue dans ma procédure stockée
    un print @AVALUE , le serveur SQL me renvoie la bonne valeur.

    Après quelques jours de lutte , je suis perdu.
    En espérant trouvé de l'aide de votre part. Merci d'avance

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Lorsque tu testes ta SP sous l'analyseur de requête, il faut préciser OUTPUT sur le paramètre de sortie au moment de l'appel :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    declare @toto int
    exec SP_GENERATOR 'ARMATEUR' , output @toto
    print @toto
    Au fait avec SQL Server il n'est pas nécessaire de mettre un bloc BEGIN END autour des instructions T-SQL. Tu peux mettre ton script directement.
    De plus, les ';' sont acceptés, mais ils ne servent à rien (toujours pour SQL Server).

    Autre remarque, pourquoi utiliser un curseur dans SP_GENERATOR ?

    Il suffit de faire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE PROCEDURE SP_GENERATOR
    (
      @TABLENOM  D_NOM,
      @AVALUE D_NUMID OUTPUT 
    )
    AS
    begin
      begin tran
        UPDATE TABLE_CPT SET CPT = CPT + 1 WHERE NOM=@TableNom
        select @AVALUE = CPT from TABLE_CPT where NOM=@TableNom
      commit tran
    end

    Sinon, pour ce qui est de ton paramètre de sortie il faut voir ce que tu fais dans CreateStoredProc. Il se peut que le problème vienne du fait que ton composant pour exécuter la SP utilise le paramètre n°0 pour renvoyer le code de retour de la procédure stockée.

    Tu pourrais commencer par exécuter ta SP avec une query et non pas avec un composant SP.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Tout d'abord merci d'avoir regardé et surtout répondu.

    J'ai changer ma Ps pour avoir (sans cursor car c'est vrai cela ne sert a rien):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE PROCEDURE "SP_GENERATOR" 
    (
      @TABLENOM  D_NOM,
      @AVALUE D_NUMID OUTPUT
    )
    as
    begin
           UPDATE TABLE_CPT SET CPT = CPT + 1 WHERE NOM=@TableNom;
           select @AVALUE = (SELECT CPT from TABLE_CPT where NOM = @TABLENOM);
     end;
    GO
    J'ai vue dans le forum ,maintenant ça marche dans l'analyseur SQL , je fais simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    declare @toto int;
    execute SP_GENERATOR 'ARMATEUR', @toto output;
    select @toto;
    Ma réponse est bien celle attendue , mais dans delphi impossible de récupérer le résultat.
    Ps : en utilisant un Query , il me sort l'erreur "Curseur non renvoyer par query"

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut J'avance... à ptit pas
    J'ai trouvé une solution pour récupérer mon résultat mais ça resourd pas mon problème , dans ma procédure stockée j'enleve l'ordre update.
    Ce que je fais en passant par un TSQLQuery :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       SQLQuery1.Close;
       SQLQuery1.SQLConnection := FDataConn.SQLConnection;
       SQLQuery1.SQL.Clear;   
       SQLQuery1.SQL.Add('declare @NB D_NUMID ;');
       SQLQuery1.SQL.Add(Format('execute SP_GENERATOR %s, @NB OUTPUT ; ', [QuotedSQL('ARMATEUR')] ));
       SQLQuery1.SQL.Add('select @NB ');
       SQLQuery1.Open;
       id := SQLQuery1.Fields[0].AsInteger;

    Mon prolème est que la procédure stockée ne prend pas l'ordre update.
    Donc ce que je vais une procedure stockée qui appelle une autre procedure

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Ca devrait fonctionner pourtant de cette manière.
    C'est comme ça que j'ai exécuté mes procédures stockées en ADO pendant très longtemps.

    Si ça fonctionne lorsque tu mets l'update en commentaire, mais que ça ne marche plus avec l'update dans la SP, je ne vois plus qu'une seule explication.
    Essaie d'ajouter :
    au début de la procédure stockée, juste après le BEGIN, et avant l'update.
    Remarque, tu peux aussi exécuter SET NOCOUNT ON après chaque ouverture de connexion, on le configurer dans les options de connexion par défaut de SQL Server.

    En temps normal, SQL Server calcule le nombre de ligne affectées par chaque instruction (donc par l'UPDATE dans la SP). Ce nombre de ligne est renvoyé au client avec le jeu de données.
    DbExpress doit recevoir cette information en premier et essayer d'ouvrir son curseur dessus au lieu de l'ouvrir sur le jeu de données qui suit...
    En mettant SET NOCOUNT ON, on dit à SQL Server de ne plus compter les lignes. L'update ne renvoie donc plus d'informations supplémentaires au client et ça devrait éviter que DbExpress ne se perde...
    De plus, ça permet d'améliorer un peu les performances puisqu'on réduit le trafic réseau.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Terrible ça marche . Merci Beaucoup de chez beaucoup

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

Discussions similaires

  1. procedure stocké entre delphi7 et sql serveur
    Par thered dans le forum Bases de données
    Réponses: 5
    Dernier message: 01/02/2011, 11h45
  2. Réponses: 1
    Dernier message: 04/06/2003, 11h48
  3. procedure stockée champ date
    Par tripper.dim dans le forum SQL
    Réponses: 5
    Dernier message: 25/04/2003, 09h47
  4. Appel a une procedure stockée en vba
    Par The_Nail dans le forum VBA Access
    Réponses: 36
    Dernier message: 01/04/2003, 16h44
  5. procedure stockée dans un dbbatch
    Par pram dans le forum XMLRAD
    Réponses: 4
    Dernier message: 07/02/2003, 16h35

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