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.