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 :

transaction IB FIREBIRD 2.1.1


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut transaction IB FIREBIRD 2.1.1
    Bonjour,
    ci dessous un code qui contient deux requetes SQL avec une transaction

    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
     
    try
    if not dm.IBTransaction2.InTransaction then
    dm.IBTransaction2.StartTransaction;
     
      LeCft:=DM.GetCpt('FACTURES');
      if not DM.Isrt_Updt( ' Insert Into FACTURES  '+
    ' (ID_FACT,DATE_FACT,TYPE_F,TYPE_V)'+
    ' values('''+IntToStr(LeCft)+''' '+
    ','+QuotedStr(formatDateTime('yyyy-mm-dd',now()))+','+
    ' 1,1)')
        then showmessage('COMMANDE not FACTURER....')
          else
          showmessage('COMMANDE FACTURER SOUS N° FA'+IntToStr(LeCft)+'...!');
     
     
    DM.Isrt_Updt( 'UPDATE COMMANDE SET ID_FACT= '''+IntToStr(LeCft)+''' WHERE CODE_COM='''+QRA.FieldValues['CODE_COM']+''' ');
     dm.IBTransaction2.Commit
    except
    dm.IBTransaction2.Rollback
    end;
    pourquoi en generant une exception dans la deuxieme requete(UPDATE COMMANDE ..) la premiere requete (Insert Into FACTURES...) s'execute et insert dans la table Facture alors que le principe de la transaction tous ou rien !?


    delphi7,firebird 2.1.1,IBX,Windows XP

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Un update sur une table ne va pas te renvoyer d'exception à moins que la table ou le champ n'existe pas ! Et encore, il pourrait simplement te renvoyer un booléen.

    Sinon, il faudrait faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not DM.Isrt_Updt( 'UPDATE...') then
      Exception.Create('Erreur');

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    merci Andnotor;
    mais le probleme persiste toujours meme avec Exception.Create('Erreur')
    j pas compris normalement une exception genere un rollback donc pas de modification dans la premiere requete

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    C'est que même si aucun enregistrement n'est mis à jour avec ton Update (parce que la clause where n'est pas respectée) la requête c'est terminée avec succès .

    Pourquoi penses-tu que cette commande va se planter ?
    DM.Isrt_Updt( 'UPDATE COMMANDE SET ID_FACT= '''+IntToStr(LeCft)+''' WHERE CODE_COM='''+QRA.FieldValues['CODE_COM']+''' ');

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    Pourquoi penses-tu que cette commande va se planter ?
    perce que dans la compilation delphi genere une exception

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par fthdz Voir le message
    perce que dans la compilation delphi genere une exception
    une compilation n'a rien a voir avec l'exécution d'un programme !

    si tu avais fait un essai en mettant un champ inconnu dans ta requete update le try except aurait fonctionné
    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE COMMANDE SET UNCHAMP_INEXISTANT= '''+IntToStr(LeCft)+''' WHERE CODE_COM='''+QRA.FieldValues['CODE_COM']+'''
    maintenant s'il s'agit de vérifier si le UPDATE à fait quelque chose (c'est a dire la mise a jour d'un enregistrement aou d'aucun parce qu'il n'a rien trouvé) je pense que avec Firebird 2.1 tu dois pouvoir utiliser la clause RETURNING (Voir ici) pour ensuite tester cette ou ces valeurs retournées pour ensuite comme le suggère AndNotOr provoqué une exception .

    Le seul truc qui me chiffonne est que je ne sais pas si les IBcomposants accepteront la clause RETURNING
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    merci pour vos reponses,

    mais le probleme n'est pas dans instruction update(je peux corrigé l'erreur d'exception) mais dans la transaction,a ma connaissance une transaction c'est tous ou rien
    pourquoi 'insert a mise ajour la table facture alors que update n'a pas marcher
    alors qu'ils se trouve dans le meme bloc de transaction ,normalement les deux n'execute pas .

    merci d'avance

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par fthdz Voir le message
    pourquoi 'insert a mise ajour la table facture alors que update n'a pas marcher
    alors qu'ils se trouve dans le meme bloc de transaction ,normalement les deux n'execute pas .
    Il y a confusion . Oui un transaction c'est du "tout ou rien" . Le update contrairement a ce que tu dit a marché (il n'a rien fait , d'accord, mais ne rien faire ce n'est pas renvoyer une erreur)

    de plus tu te trompes dans l'interprétation de ne s'exécutent pas en fait les deux instructions s'exécutent (ou essayent) c'est le fait par la suite de valider (Commit) ou retourner en arrière (rollback) qui font que les données sont changées ou non dans la base . De plus dépendant du niveau d'isolation de la transaction ces changements (du moins au entre le début et la fin de la transaction seront visibles ou non)

    de plus , je le répète , une exception ? à la compilation?! n'a rien à voir .
    d'ailleurs j'aimerais bien voir ce texte d'erreur
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Un update sur une table ne va pas te renvoyer d'exception à moins que la table ou le champ n'existe pas ! Et encore, il pourrait simplement te renvoyer un booléen.
    Dans l'absolu, cela se discute, une violation de contrainte peut toujours être imaginée.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    effectivement j'avais oublié ce cas

    cependant un petit showmessage supplémentaire dans la partie except du try aurait pour le moins permis de savoir si l'exception avait lieu ou non .
    De plus fthdz nous parle d'une erreur de "compilation"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Dans l'absolu, cela se discute, une violation de contrainte peut toujours être imaginée.
    Je te crois sur parole, ça fait longtemps que je n'ai plus fait de base de données .

    Je n'aurais certainement pas du parler de table, mais le champ dans mon esprit était QRA.FieldValues['CODE_COM'].

    Maintenant, il faudrait savoir si le composant DM.Isrt_Updt (donc on ne connait pas le type ) génère une exception en cas d'erreur SQL ou renvoi simplement FALSE.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    bonjour tout le monde,

    Maintenant, il faudrait savoir si le composant DM.Isrt_Updt (donc on ne connait pas le type ) génère une exception en cas d'erreur SQL ou renvoi simplement FALSE.
    voici le code de la fonction :
    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 Tdm.Isrt_Updt (instruction:string):BOOLEAN;
    begin
     
     try                        
        IBSQL_up.Close;
        IBSQL_up.SQL.Clear;
        IBSQL_up.SQL.Add(instruction);
         try
        IBSQL_up.ExecQuery;
        if not  IBSQL_up.Prepared then  IBSQL_up.Prepare;
        IBSQL_up.transaction.CommitRetaining;
        result:=True;
        except
        if IBSQL_up.transaction.InTransaction then
           begin
            IBSQL_up.transaction.Rollback;
            //showmessage('ajout non effectuer');
            result:=False;
           end;
        end;
        finally
         IBSQL_up.Close;
        end;
     
    end;

    avec IBSQL_up:TIBSQL

    pour l'erreur dans la compilation:
    project.exe raised exception class EVarientTypeCastError with message '
    could not convert variant of type (string) into type(double) process stopped'
    mais dans l'execution de Project.exe aucune exception n'apparait

    cependant un petit showmessage supplémentaire dans la partie except du try aurait pour le moins permis de savoir si l'exception avait lieu ou non .
    De plus fthdz nous parle d'une erreur de "compilation"
    apres l'ajout d'un showmessage dans la partie except le showmessage affiche le message donc l'exception avait lieu.

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Et avec un CommitRetaining, tu ne penses pas que ton 1er Insert a été validé .

    Je pense aussi que l'ensemble de ta fonction pourrait se résumé à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IBSQL_up.SQL.Text := instruction;
    IBSQL_up.ExecQuery;
    Quant à l'exception, je ne vois pas où tu as besoin d'un double, mais le seul variant que tu lis est QRA.FieldValues['CODE_COM'].

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Je viens enfin de comprendre ton terme de compilation (en fait tu voulais dire en mode debug) . Dans ce cas là effectivement tu "vois" l'erreur parce que lors du debug l'exception s'affiche quand même (enfin lorsque l'IDE est configurée ainsi), contrairement au mode exécution du programme ou bien évidemment l'exception passe à la trappe .

    tu aurais fait un try except de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try 
    ...
    except 
      on E:Exception begin
        ShowMessage('Zut Planté '+#13#10+E.message); 
      end;
    end;
    on aurait retrouvé le même message a l'exécution du programme

    Ceci étant posé je n'aime pas du tout ce CommitRetaining moi non plus .

    tout comme je n'aime pas beaucoup les valeurs passées dans la chaine du SQL . Je préfére nettement utilisé des Query avec paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'UPDATE COMMANDE SET ID_FACT=:ID WHERE CODE_COM=:CODE'
    cet update est beaucoup plus convaincant à mon gout
    utilisé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query.ParamByName('ID').asInteger:=LeCft;
    Query.ParamByName('CODE').asString :=QRA.FieldByName('CODE_COM').asString;
    ce qui donnerait une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Tdm.Isrt_Updt (L : integer; C : String):BOOLEAN;
    begin
      try 
         IBSQL_up.Close;
        IBSQL_up.SQL.Text:='UPDATE COMMANDE SET ID_FACT=:ID WHERE   CODE_COM=:CODE';
        IBSQL_up.ParamByName('ID').asInteger:=L;
        IBSQL_up.ParamByName('CODE').asString:=C;
        IBSQL_up.ExecSQL;
        result:=true; 
      except
        result:=false;
      end;
    end;
    et tant qu'a faire , autres remarques :
    le insert pourrait également être utilisé avec des parametres
    si la date du insert est à now pourquoi ne pas utiliser plutôt le trigger before insert de firebird et la date du serveur de BDD et non celle du poste de travail
    et pour aller encore plus loin est-ce que tout ceci ne peut pas se faire directement par le trigger ou une procedure Firebird ?

    EDIT . PS , ceci est écrit a la volée, a peine vérifié , c'est plutôt le shema directeur qui est a prendre en compte
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. [Base de donnée] Paramètres d'une transaction sous Firebird
    Par Socrat dans le forum C++Builder
    Réponses: 0
    Dernier message: 13/07/2011, 20h46
  2. Gestion transactions sous Firebird (v1.5.4)
    Par Zepeq dans le forum Connexion aux bases de données
    Réponses: 13
    Dernier message: 17/10/2007, 08h35
  3. [Delphi - Firebird] Gestion des transactions
    Par Lili21 dans le forum Connexion aux bases de données
    Réponses: 9
    Dernier message: 20/04/2007, 17h34
  4. DLL et transaction Interbase/Firebird ?
    Par QAYS dans le forum Delphi
    Réponses: 2
    Dernier message: 29/09/2006, 19h09
  5. Où gérer les transactions avec Firebird ?
    Par DMO dans le forum Débuter
    Réponses: 2
    Dernier message: 26/04/2005, 09h21

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