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 :

ZEOSDBO + Firebird EZSQLException


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut ZEOSDBO + Firebird EZSQLException
    Bonsoir,
    J'ai une application qui utilise les composants ZEOSDBO-7.1.4-stable + Firebird 2.5.

    -Pour supprimer un enregistrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table1.Edit;
    Table1.Delete;
    Table1.ApplyUpdates;
    Table1.CommitUpdates;
    L'enregistrement supprimé ne reste pas en mémoire, il est supprimé définitivement de la table.

    -Pour ajouter un nouvel enregistrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Table1.append;
    ...
    Table1.post;
    Table1.ApplyUpdates;
    Table1.CommitUpdates;
    Mais si j'ajoute un nouvel enregistrement et que je veux supprimer l'enregistrement que je viens d'ajouter, je reçois un message d'erreur:
    "Le projet ...exe a déclenché la classe d'exception EZSQLException avec le message '0 record(s) updated only one record should have been updated'

    Ce message d'erreur s'affiche seulement quand j'essaye de supprimer l'enregistrement que je viens d'ajouter mais si j'essaye de supprimer un autre enregistrement, ça marche: je ne reçois pas ce message d'erreur.

    j'ai essayé de modifier le code de suppression de l'enregistrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table1.Edit;
    Table1.Delete;
    mais ce code n'efface pas réellement l'enregistrement de la Table, il l'efface de la mémoire seulement.

    Table1 : CachedUpdates est à False
    Comment résoudre ce soucis svp?.
    Merci pour votre aide.

    Nabil

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Pour supprimer un enregistrement, un simple table.delete suffit, surtout pas un Table.Edit avant !
    pour explication : table.Edit demande à mettre l'enregistrement en mode édition (mise à jour, une transaction A) donc attend, quelques instructions de modification de colonnes puis un table.Post (pour la fin de la transaction)
    or si avant le post, donc en concurrence avec cette transaction A une opération Delete se fait (soit une autre transaction B). Les ApplyUpdates,CommitUpdates suivant tente d'appliquer la transaction A sur un élément non trouvé (puisque supprimé) d'où l'erreur levée.

    Table1 : CachedUpdates est à False
    je ne vois pas pourquoi alors, il y a des ApplyUpdates,CommitUpdates je pense qu'il y a là une mauvaise compréhension sur l'utilité de ces instructions ou alors du paramétrage de la table ou de la connexion, pour moi ces deux instructions sont en trop !
    Zeos fonctionne comme BDE (c'est pour cela que je dis qu'une bonne transaction est une transaction la plus courte possible) un insert/un delete/un post -> un commit c'est la règle de l'autocommit (que l'on peut contourner pour un ensemble de transactions par un Start Transaction ..... Commit Transaction).
    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

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonjour ,
    Merci Serge pour ton explication.

    Voici mon code pour le post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try 
         ZConnection1.StartTransaction;
          Table1.Post;
          ZConnection1.Commit;
        except
          ZConnection1.Rollback;
          raise;
        end;

    Pour le delete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try    
          ZConnection1.StartTransaction;
          Table1.Delete;
          ZConnection1.Commit;
        except
          ZConnection1.Rollback;
          raise;
        end;
    le post ajoute l"enregistrement mais en mémoire seulement(si je fait un close et après un open de la Table, l'enregistrement disparait !!)

    La ZConnection1 est en Autocomit.
    Quelle est mon erreur ici svp?
    merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Réponse Rapide : mais pourquoi une transaction alors que ZEOS fait ça tout seul ?
    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

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Merci,
    J'ai essayé avec ou sans la transaction, l'enregisterment reste en mémoire, donc le post(le commit) ne marche pas?!

    J'ai essayé avec :tiReadCommitted,tiRepeatableRead et tiNone sans succès.

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    voici ZConnection
    Nom : Zconnection.jpg
Affichages : 553
Taille : 40,8 Ko

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    si j'écris comme ça!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try  
          Table1.Post;    
         Table1.ApplyUpdates;
        except
          raise;
        end;
    l'enregistrement se fait sans soucis. Il ne reste pas en mémoire.

    Mais si j'essaye de le supprimer(celui que je viens de poster), pas de chance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try
          Table1.Delete;
         Table1.ApplyUpdates;
        except
          raise;
        end;

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Plutôt que de tâtonner, j'ai fait une petit programme rapide (avec ta base de données puisque j'avais une structure, sur la table categorie)
    il est loin d'être parfait (c'est fait à la va vite) mais je te garanti qu'une insertion ou une suppression ne se fait pas en mémoire

    je pense qu'avec cet exemple tu devrais réussir à voir où peut se situer le problème.

    Attention, tu ne peux pas compiler tel quel à cause des chemins de recherche de bibliothèque

    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
    procedure TForm22.AjoutClick(Sender: TObject);
    begin
    ZTable1.Append;
    end;
     
    procedure TForm22.CloseClick(Sender: TObject);
    begin
    ZTable1.Close;
    end;
     
    procedure TForm22.DataSource1StateChange(Sender: TObject);
    begin
    Suppression.Enabled:=not (Datasource1.State in [dsEdit]);
    Ajout.Enabled:=Suppression.Enabled;
    Validation.Enabled:=DataSource1.State in [dsEdit,dsinsert];
     
    end;
     
    procedure TForm22.OpenClick(Sender: TObject);
    begin
    if not ZConnection1.Connected then // pour le premier Open uniquement 
      begin
        ZConnection1.Database:=Base.text;
        ZConnection1.Password:=pwd.Text;
      end;
    ZTable1.Open;
    end;
     
    procedure TForm22.SuppressionClick(Sender: TObject);
    begin
    Ztable1.Delete;
    end;
     
    procedure TForm22.ValidationClick(Sender: TObject);
    begin
    ZTable1.Post;
    end;
    P.S. ZConnection même si c'est en localhost j'indique toujours le serveur et 127.0.0.1 plutôt que "localhost"
    P.P.S mais quelles Updates veut tu appliquer après un Delete ? j'ai l'impression que tu prends applyupdates pour ce qu'il n'est pas
    Fichiers attachés Fichiers attachés
    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 confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Merci Serge pour ton aide.
    Tu sais, j'ai toujours le même problème même avec cet exemple(que je te remercie beaucoup pour ton temps).

    Bon, je t'explique:
    Clique sur le bouton "ajout" ensuite clique sur le bouton "validation" et puis clique sur le bouton "suppression" et là, s'affiche ce message d'erreur. il apparait seulement sur l'enregistrement qu'on vient de poster! Pour les autres enregistrements, il n' y pas de soucis! On peut les effacer.

    Si je clique sur le bouton "ajout" ensuite clique sur le bouton "validation" et je fais un close puis un open de la BDD, l'enregistrement qu'on vient de poster, on peut le supprimer sans problème! ou si on fait un refresh de la Table, ça marche aussi

    J'ai rien pigé le pourquoi?

    Merci

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Tu sais, j'ai toujours le même problème même avec cet exemple(que je te remercie beaucoup pour ton temps).
    Bon, je t'explique:
    Clique sur le bouton "ajout" ensuite clique sur le bouton "validation" et puis clique sur le bouton "suppression" et là, s'affiche ce message d'erreur. il apparait seulement sur l'enregistrement qu'on vient de poster! Pour les autres enregistrements, il n' y pas de soucis! On peut les effacer.
    je viens de refaire la manipulation ([Ajout],saisie d'un numero et d'un libellé,[Validation]) ok l'enregistrement apparait dans la grille, dans la foulée [Suppression]) pas d'erreur
    N.B. une petite correction s'impose ligne 13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Suppression.Enabled:=not (Datasource1.State in [dsEdit,dsInsert]);
    nota: à moins que ce soit du à la version de ZEOS pour des raisons pratiques le programme proposé à été fait avec la version 7.0 et non 7.1.2
    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
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonjour,

    C'est résolu.Merci Serge!

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

Discussions similaires

  1. [Débat] Choisir InterBase/Firebird ou Microsoft SQL-SERVER ?
    Par asenaici dans le forum Décisions SGBD
    Réponses: 90
    Dernier message: 19/03/2009, 20h51
  2. [FIREBIRD]Drivers ODBC
    Par tripper.dim dans le forum Connexion aux bases de données
    Réponses: 10
    Dernier message: 24/04/2007, 11h02
  3. Lien vers Mozilla Firebird : il manque les themes
    Par Nasky dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 20/10/2003, 13h24
  4. [firebird] Connexion impossible en lecture seule
    Par severine dans le forum Administration
    Réponses: 2
    Dernier message: 01/08/2003, 15h35
  5. Refus d'accès à une base Firebird
    Par severine dans le forum Installation
    Réponses: 18
    Dernier message: 04/06/2003, 16h03

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