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 :

Utiliser TQuery pour modifications


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut Utiliser TQuery pour modifications
    Bonjour

    Je débute quasiment en Delphi, et je n'arrive pas à trouver comment, sans générer une erreur d'exécution, utiliser un composant dérivé de TQuery pour...

    1. faire un SELECT pour alimenter un grid db-aware
    2. offrir un bouton pour faire un INSERT via ce TQuery
    3. rafraîchir le grid pour qu'il reflète l'insertion

    Voici un exemple de test utilisant les composants DB + Query et le NextDBGrid de Aducom et Bergsoft, respectivement:

    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
     
    //On crée la base + la table, et on la lie au grid
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      With ASQLite3DB1 do begin
        DefaultDir := ExtractFileDir(Application.ExeName);
        Database := 'test.sqlite';
        Open;
        SQLite3_ExecSQL('CREATE TABLE IF NOT EXISTS books (isbn INTEGER PRIMARY KEY, language VARCHAR)');
        //SQLite3_ExecSQL('INSERT INTO books (isbn,language) VALUES (123,"english")');
      end;
     
      With ASQLite3Query1 do begin
        Connection := ASQLite3DB1;
        SQL.Text := 'SELECT * FROM books';
        Open;
      end;
     
      DataSource1.DataSet := ASQLite3Query1;
     
      With NextDBGrid1 do begin
        DataSource := DataSource1;
        //Pour que la colonne de droite prenne toute la place
        Columns[ASQLite3Query1.FieldCount-1].Options := NextDBGrid1.Columns[ASQLite3Query1.FieldCount-1].Options + [coAutoSize];
      end;
     
    end;
     
    //On insère un nouvel enregistrement
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      With ASQLite3Query1 do begin
        Close;
        SQL.Clear;
        SQL.Text := 'INSERT INTO books (isbn,language) VALUES (:a,:b)';
        //A modifier à chaque appel : clé unique
        params[0].AsInteger := 567;
        params[1].AsString := 'something';
     
        //Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004DB408 in module 'Project1.exe'
        ExecSQL;
     
        SQL.Clear;
        SQL.Text := 'SELECT * FROM books';
        //SQL.Add()
        Open;
      end;
     
    end;
    Merci pour toute piste.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    Alors, apparemment, pour pouvoir remplir un DBgrid avec un SELECT, et ajouter des enregistrements avec un INSERT, il faut deux TQuery et un TUpdateSQL: Avec juste un seul TQuery, on a une exception juste après TQuery.ExecSQL, même si la commande est correctement exécutée (on relance, et on voit que le INSERT est bien passé):

    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     with ASQLite3Query2 do begin
       Close;
       SQL.Clear;
     
       //SQL.Add('INSERT INTO books (isbn,language) VALUES (NULL,:a)');
       SQL.Text := 'INSERT INTO books (isbn,language) VALUES (NULL,:a)';
     
       Params[0].AsString := 'test';
       ExecSQL;
     end;
     
      ASQLite3Query1.Refresh; 
    end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      With ASQLite3DB1 do begin
        DefaultDir := ExtractFileDir(Application.ExeName);
        Database := 'mybooks.sqlite';
        Open;
        SQLite3_ExecSQL('CREATE TABLE IF NOT EXISTS books (isbn INTEGER PRIMARY KEY, language VARCHAR)');
        //SQLite3_ExecSQL('INSERT INTO books (isbn,language) VALUES (123,"english")');
      end;
     
      With ASQLite3UpdateSQL1 do begin
        //BAD InsertSQL.Strings := 'INSERT INTO books *';
        //InsertSQL.Add('INSERT INTO books *');
        InsertSQL.Text := 'INSERT INTO books *';
      end;
     
      With ASQLite3Query1 do begin
        Connection := ASQLite3DB1;
        SQL.Text := 'SELECT * FROM books';
        UpdateSQL := ASQLite3UpdateSQL1;
        Open;
      end;
     
      With ASQLite3Query2 do begin
        Connection := ASQLite3DB1;
        SQL.Text := 'SELECT * FROM books';
        UpdateSQL := ASQLite3UpdateSQL1;
        Open;
      end;
     
      DataSource1.DataSet := ASQLite3Query1;
     
      With NextDBGrid1 do begin
        DataSource := DataSource1;
        Columns[ASQLite3Query1.FieldCount-1].Options := NextDBGrid1.Columns[ASQLite3Query1.FieldCount-1].Options + [coAutoSize];
      end;
     
    end;
     
    end.
    Puisque TQuery.ExecSQL permet d'exécuter INSERT, quelqu'un pourrait-il me dire à quoi sert TUpdateSQL? C'est indispensable lorsqu'on utilise des composants DB-aware?

    Merci.

  3. #3
    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
    Bonjour.
    Alors tu as deux solutions :
    1° Utiliser un TQuery avec SQL Select pour recupérer les infos et les afficher dans une grille via un TDataSource et une autre TQuery pour les Insert/Update/Delete de ces infos.
    2° Utiliser un TQuery avec SQL Select pour recupérer les infos et les afficher dans une grille via un TDataSource et un TUpdateSQL rattaché au TQuery. Mais tu dois renseigner les propriétés UpdateSQL, InsertSQL et DeleteSQL afin que tu puisse directement faire des Update/Insert ou Delete via la même TQuery.
    Voilà
    On progresse .....

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/05/2012, 16h37
  2. [MySQL] ( GET ) Lien utilisant ID pour afficher page modification
    Par spidercrash dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/04/2010, 20h00
  3. Réponses: 1
    Dernier message: 31/12/2008, 10h19
  4. Utiliser un TQuery pour Proc.Stockée D2006
    Par sbeu dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/01/2007, 15h01
  5. utiliser "if" pour faire deux actions differente
    Par vampyer972 dans le forum C
    Réponses: 2
    Dernier message: 09/05/2004, 10h12

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