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 :

[DELPHI][PROECEDURES STOCKES] Access violation


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut [DELPHI][PROECEDURES STOCKES] Access violation
    Bonjour,

    J'utilise le composant "StoredProc" afin d'éxecuter et de récupérer les résultats d'un procédure stockée.

    J'utilise la méthode Open.
    Cependant, dès lors que je tente de fermer la procédure à l'aide de la méthode Close, j'ai une erreur "Acces violation..." avec la fenêtre de console qui s'ouvre.
    Avec Delphi fermé, ce bug ce traduit par une fermeture pur et simple du programme.

    J'ai tenté d'utiliser les valeurs du paramètre 'Active:=true/false' pour remplace Open/Close mais j'ai le même soucis.

    Si je me contente d'utiliser la méthode "ExecProc", tout ce passe très bien, mais bon, je ne peux bien sur pas récupérer les valeurs de retour.

    Je suis vraiment coincé là, je travaille avec Delphi 7 entreprise sur Windows XP Pro.

    Merci pour votre aide

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2003
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2003
    Messages : 56
    Points : 45
    Points
    45
    Par défaut
    salut, moi j'utilise execproc et je peux récupérer mes valeurs de retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ValRetour := ProcStock.ParamByName('R_Retour').AsString;
    @++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    mars 2003
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : mars 2003
    Messages : 163
    Points : 90
    Points
    90
    Par défaut
    Je vous donne un exemple du procédure stocké pour vous et ca marche bien.

    Exemple procédure stocké d'enregistrement ou modification employé:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    COMMIT WORK;
    SET AUTODDL OFF;
    SET TERM ^ ;
     
    /* Stored procedures */
     
    CREATE PROCEDURE "SP_INS_EMP" 
    (
      "CODE_EMP" INTEGER,
      "CODE_TYPE" INTEGER,
      "ENOM" VARCHAR(25),
      "EPRENOM" VARCHAR(25),
      "ELOGIN" VARCHAR(25),
      "EPASS" VARCHAR(100),
      "EDDV" DATE,
      "EACCES" VARCHAR(1)
    )
    RETURNS
    (
      "RESULT_CODE" INTEGER
    )
    AS
    BEGIN EXIT; END ^
     
     
    ALTER PROCEDURE "SP_INS_EMP" 
    (
      "CODE_EMP" INTEGER,
      "CODE_TYPE" INTEGER,
      "ENOM" VARCHAR(25),
      "EPRENOM" VARCHAR(25),
      "ELOGIN" VARCHAR(25),
      "EPASS" VARCHAR(100),
      "EDDV" DATE,
      "EACCES" VARCHAR(1)
    )
    RETURNS
    (
      "RESULT_CODE" INTEGER
    )
    AS
    BEGIN
        SELECT ID_EMP FROM EMPLOYE
            WHERE ID_EMP = :CODE_EMP
            INTO :CODE_EMP;
     
        /* Le type employé existe, on le met à jour */
        IF ((CODE_EMP IS NOT NULL) AND (CODE_EMP <> 0)) THEN BEGIN
            UPDATE EMPLOYE
                SET ID_TYPEEMP = :CODE_TYPE,
                    NOM = :ENOM,
                    PRENOM = :EPRENOM,
                    LOGIN = :ELOGIN,
                    PASS = :EPASS,
                    DDV = :EDDV,
                    ACCES = :EACCES
                WHERE (ID_EMP = :CODE_EMP) ;
            END
     
        /* Le type employé à créer */
        ELSE BEGIN
            /* Initialisation du code grâce à un générateur */
            RESULT_CODE = GEN_ID(GEN_EMPLOYE_ID, 1);
            INSERT INTO EMPLOYE(
                        ID_EMP,
                        ID_TYPEEMP,
                        NOM,
                        PRENOM,
                        LOGIN,
                        PASS,
                        DDV,
                        ACCES)
                  VALUES(
                        :RESULT_CODE,
                        :CODE_TYPE,
                        :ENOM,
                        :EPRENOM,
                        :ELOGIN,
                        :EPASS,
                        :EDDV,
                        :EACCES);
            END
     
    SUSPEND;
     
    END
     ^
     
    SET TERM ; ^
    COMMIT WORK;
    SET AUTODDL ON;
    Pour envoyer les valeurs:
    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
    with DMPOS do begin 
                SP_Emp.StoredProcName := 'SP_INS_EMP'; 
                SP_Emp.Prepare; 
                   try 
                      SP_Emp.Params[1].AsInteger   := StrToIntDef(ECode.Text,0); 
                      SP_Emp.Params[2].AsInteger := strtoint(EType.LookupValue); 
                      SP_Emp.Params[3].AsString   := ENom.Text; 
                      SP_Emp.Params[4].AsString    := EPrenom.Text; 
                      SP_Emp.Params[5].AsString    := EUser.Text; 
                      SP_Emp.Params[6].AsString    := EPass.Text; 
                      SP_Emp.Params[7].AsDate       := MaDate; 
                      SP_Emp.Params[8].AsString    := Emp_EAccesResult(EAcces.Checked); 
                      SP_Emp.ExecProc; 
                    // si c un nouveau employé, donc le code est vide, alors on peut récupérer le code par exemple 
                      if (ECode.Text = '') then begin 
                         ECode.Text := SP_Emp.ParamByName('RESULT_CODE').AsString; 
                         Mes := True; 
                         end 
                      else Mes := False; 
                   finally 
                      SP_Emp.UnPrepare; 
                      QEmp.Close; 
                      QEmp.Open; 
                   end; 
                end;
    Vlà c'est un exmple, ca marche et très efficace.
    Cordialement

    Fred ;-)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup a vous d'avoir pris le temps de me répondre
    Mais j'aurais du précier un détail, qui après quelque test, est un point clé de mon soucis : Je cherche a retourner des ensembles de données en retour de procédure stockées (une table plus précisément, un peu comme le ferait une requete SELECT).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    mars 2003
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : mars 2003
    Messages : 163
    Points : 90
    Points
    90
    Par défaut
    Le mieux c'est de faire SELECT * FROM table WHERE etc... car si jamais tu utilises la fonction recherche, celà facilitera des choses. Quant à pour moi la procédure stocké, c'est bien pour l'enregistrement et la modification mais aussi select quand la table de bdd contient plusieurs millions d'enregistrement.

    Cordialement

    Fred ;-)

  6. #6
    Membre à l'essai
    Inscrit en
    mai 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : mai 2004
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Pour récuperer une liste de données provenant d'une procédure stockée il faut utiliser un Query, comme pour une requete SQL.

    Par exemple la procedure stockée :
    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
     
    Create Procedure ListeClient (IdPays Integer)
    Returns (Nom VarChar(30), Prenom VarChar(30))
    as
    begin
     
     For Select Nom,Prenom 
            From Client
          Where IdPays = :IdPays
              Into :Nom, :Prenom Do
        begin
            Suspend;
        end
     
    end;
    pourra être visible en utilisant la requete suivante dans un Query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select * From ListeClient(:IdPay);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Merci a vous tous pour votre aide, mais je viens de trouver la solution.

    En fait, la déclaration result (qui permet de déclarer les types de champs que l'on retourne), etait la cause de mes soucis : elle fait littéralement planter le composant TStoredProc, et même les composants Query.

    Je met un exmple pour les utilisateurs de Sybase qui pourrons rencontrer aussi ce soucis :

    Marche avec un serveur IIS et plante avec Delphi 7 :

    ALTER procedure DBA.testkiplante(in leparam1 varchar(20))
    result(gains real, gagne integer, classbon integer)
    begin
    select don as gains,diff as gagne,oper as classbon from evinn where form=leparam1;
    end;

    Marche avec Delphi 7 :

    ALTER procedure DBA.testkiplantepas(in leparam1 varchar(20))
    begin
    select don as gains,diff as gagne,oper as classbon from evinn where form=leparam1;
    end;

    Contrairement à ce qui peut bien être dit, la commande result n'est pas indispensable pour recupérer les valeurs de retour, pire elle fait planter Delphi.
    Pensez aussi à virer les champs de retour dans la propriété Params de TStoredProc ou vous aurez une erreur lors de l'ouverture de celui-ci : 'Nombre d'arguments incorrectes'.

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

Discussions similaires

  1. Delphi Free Access Violation
    Par cchasse98 dans le forum Débuter
    Réponses: 8
    Dernier message: 13/02/2014, 10h55
  2. Programme C vers Delphi, pointeur et Access Violation
    Par sinfoni dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 04/07/2012, 09h19
  3. Delphi 7, Indy 10, IdFTP.pas et Access violation
    Par kernigansnotdead dans le forum Composants VCL
    Réponses: 4
    Dernier message: 04/02/2008, 10h10
  4. Depuis EDI DELPHI : Access Violation
    Par powerlog dans le forum EDI
    Réponses: 1
    Dernier message: 03/08/2005, 17h59
  5. Réponses: 3
    Dernier message: 22/05/2002, 10h37

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