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 :

[ZeosLib] Comment modifier un dataset?


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut [ZeosLib] Comment modifier un dataset?
    Bonjour

    Je ne suis plus très loin, mais je n'arrive toujours pas à trouver comment se combinent TZQuery et TZUpdateSQL pour me permettre de modifier un dataset et envoyer les modifs à la base de données:

    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
        MyDB,MyUSER,MyPASSWORD : String;
        MyItem : String;
    begin
      MyDB := 'C:\test.firebird';
      MyUSER := 'sysdba';
      MyPASSWORD := 'masterkey';
     
      With ZConnection1 do begin
        Hostname := 'localhost';
        Protocol := 'firebird-2.0';
        User := MyUSER;
        Password := MyPASSWORD;
     
        Database := MyDB;
     
        Connect;
      end;
     
      With ZQuery1 do begin
        Connection := ZConnection1;
     
        //On ajoute un enregistrement
        Sql.Clear;
        Sql.Add('INSERT INTO mytable (name) VALUES (:Val1)');
        Params.ParamByName('Val1').AsString := 'John Doe';
        ExecSql;
     
        //On remplit le dataset
        Sql.Clear;
        Sql.Add('SELECT *  FROM mytable');
        Open;
     
        //On parcourt le dataset et on remplit une listbox
        First;
        while not Eof do begin
          MyItem := Format('ID=%s Name=%s',[FieldByName('id').AsString,FieldByName('name').Value]);
          ListBox1.Items.Add(MyItem);
          Next;
        end;
     
        //Comment modifier un enregistrement?
        ZUpdateSQL1.DataSet := ZQuery1;
        ZUpdateSQL1.ModifySQL.Text := 'UPDATE mytable SET name=:name WHERE id=:id';
     
        //ZQuery1: Parameter 'name' not found.
        with ZQuery1 do begin
          Params.ParamByName('name').AsString := 'Jane Doe';
          Params.ParamByName('id').AsInteger := 1;
          ExecSql;
        end;
     
      end;
    Quelqu'un pourrait-il me dire comment on fait?

    Question accessoire : a-t-on vraiment besoin de deux composants? Ne peut-on pas envoyer les INSERT/UPDATE/DELETE avec un TZQuery sans s'embêter avec un TUpdateSQL?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Après un examen rapide de ton problème, il n'est pas nécessaire d'utiliser TUpdateSQL car TZQuery est suffisant. En fin pour ma part, je me limite à ce dernier.

    Par contre, dans ton code, il manque l'ouverture et la fermeture d'une transaction.

    Ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       with ZQuery1 do begin
          Params.ParamByName('name').AsString := 'Jane Doe';
          Params.ParamByName('id').AsInteger := 1;
          ExecSql;
        end;
    peut être transformé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       with ZQuery1 do begin
          ZConnection1.StartTransaction;
          try
            Params.ParamByName('name').AsString := 'Jane Doe';
            Params.ParamByName('id').AsInteger := 1;
            ExecSql;
            ZConnection1.Commit;
          except
            ZConnection1.Rollback;
          end;
        end;
    Le Commit va fermer ta base, il conviendra de faire un "open", puis de te repositionner sur le nouvel enregistrement.

    Il existe, sur ce forum, des explications concernant les transactions.

    Bon courage

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par yetanotherlogin Voir le message
    Quelqu'un pourrait-il me dire comment on fait?
    ce tutoriel
    est petit mais je crois suffisant (bien qu'en anglais)

    Citation Envoyé par yetanotherlogin Voir le message
    Question accessoire : a-t-on vraiment besoin de deux composants? Ne peut-on pas envoyer les INSERT/UPDATE/DELETE avec un TZQuery sans s'embêter avec un TUpdateSQL?
    Absolument
    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

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Merci pour votre aide.

    Si on peut envoyer des modifs avec un TZQuery... à quoi sert le composant TUpdateSQL?

    Pour le moment, j'hésite entre utiliser un composant type DBGrid ou utiliser un grid non-DB-aware.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par yetanotherlogin Voir le message
    Si on peut envoyer des modifs avec un TZQuery... à quoi sert le composant TUpdateSQL?
    moi je l'utilise avec les liaisons DBEdit et DBgrid , cela évite d'avoir a faire les assignations genre parambyname['lechamp'].value:=Edit1.text

    il y a un autre tutoriel , mais j'arrive pas a mettre le doigt dessus
    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

  6. #6
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Salut
    Citation Envoyé par yetanotherlogin Voir le message
    Si on peut envoyer des modifs avec un TZQuery... à quoi sert le composant TUpdateSQL?
    Si tu utilise des composant DBAware, il te faut absolument le TZUpdateSQL si tu ne veux pas utiliser le TZTable.
    Cela te permettra modifier/Insérer/supprimer/rafraichir les données.
    Citation Envoyé par yetanotherlogin Voir le message
    Pour le moment, j'hésite entre utiliser un composant type DBGrid ou utiliser un grid non-DB-aware.
    Ça c'est une question de choix à mon avis.

    A+
    On progresse .....

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par Andry Voir le message
    Si tu utilise des composant DBAware, il te faut absolument le TZUpdateSQL si tu ne veux pas utiliser le TZTable. Cela te permettra modifier/Insérer/supprimer/rafraichir les données.
    Donc... un composant UpdateSQL est indispensable dès qu'on utilise des composants DB-aware.

    En revanche, on peut s'en passer et n'utiliser qu'un composant Query dans le cas où on lit/écrit les données soi-même via des composants non-DB-aware.

    Merci pour les infos.

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par yetanotherlogin Voir le message
    Donc... un composant UpdateSQL est indispensable dès qu'on utilise des composants DB-aware.
    Généralement. Mais si tu veux juste afficher, tu peux t'en passer (Ex DBGrid juste pour consultation mais pas de modif).
    Citation Envoyé par yetanotherlogin Voir le message
    En revanche, on peut s'en passer et n'utiliser qu'un composant Query dans le cas où on lit/écrit les données soi-même via des composants non-DB-aware.
    Bien sur. Il faut juste remémorer que :

    • si tu as une instruction Select dans ton Query, il faut en général faire un Open
    • si tu as une instruction Delete/Update/Insert, il faut en général faire un ExecQuery ou ExecSQL selon le composant utilisé.(ExecSQL pour Zeos)

    Voilà.
    On progresse .....

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Le Commit va fermer ta base, il conviendra de faire un "open", puis de te repositionner sur le nouvel enregistrement.
    "base" ou "requête"?

    Après un commit/rollback, faut-il que je refasse un ZConnection.Connect ou un ZQuery.SQL.Add("SELECT ...") + ZQuery.Open?

    moi j'utilise [ZUpdateSQL] avec les liaisons DBEdit et DBgrid , cela évite d'avoir a faire les assignations genre parambyname['lechamp'].value:=Edit1.text
    Ca veut dire qu'un composant DB-aware connait déjà le nom des différents champs et sait donc comment remplir les paramètres dans par exemple "UpdateSQL.Update := 'UPDATE mytable SET name=:name" sans que j'aie besoin d'indiquer ce que contient ":name"?

    Si tu utilise des composant DBAware, il te faut absolument le TZUpdateSQL si tu ne veux pas utiliser le TZTable. Cela te permettra modifier/Insérer/supprimer/rafraichir les données.
    Donc en fait, UpdateSQL n'est nécessaire avec un composant DB-aware que dans le cas où ces données sont susceptibles d'être modifiées. En lecture-seule, on peut se connecter d'un Query.

    Enfin, il faut faire Query.Open pour un SELECT, mais Query.ExecSQL pour une modif.

    Soit je suis un total boulet, soit il manque cruellement un article sur le Net résumant l'historique des différentes techno d'accès aux données à partir de Delphi, avec un tutorial simple pour lire/écrire des données en mode direct et via des composants DB-aware :-/ Tout ce que j'ai trouvé, ce sont des vieux trucs d'il y a dix ans, ou des articles limités à une techno (ADO ou dbExpress ou IBX ou DataSnap), sans donner de vue d'ensemble.

    Merci bp pour vos explications.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Donc en fait, UpdateSQL n'est nécessaire avec un composant DB-aware que dans le cas où ces données sont susceptibles d'être modifiées. En lecture-seule, on peut se contenter d'un TZQueryReadonly.

    Enfin, il faut faire Query.Open pour un SELECT plus exactement lorsque le SQL renvoi un ensemble de données
    mais Query.ExecSQL pour une modif. ou tout autre instruction SQL ne renvoyant pas de données

    c'est a peu près ça en résumé

    PS. il existe aussi la methode ExecuteDirect de la ZConnection histoire d'embrouiller un peu plus les pistes
    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 éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    PS. il existe aussi la methode ExecuteDirect de la ZConnection histoire d'embrouiller un peu plus les pistes
    On progresse .....

Discussions similaires

  1. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 14h26
  2. Réponses: 2
    Dernier message: 25/08/2008, 11h41
  3. Comment cloner un dataset en delphi
    Par laurent82 dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/06/2004, 11h41
  4. comment modifier une texture?
    Par tibyann dans le forum DirectX
    Réponses: 6
    Dernier message: 16/06/2004, 16h27
  5. [ClassPath] Comment modifier le classpath d'eclipse?
    Par Elmilouse dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 08/04/2004, 19h32

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