Ciao,
tieni conto che quello che ti scrivo è frutto di tentativi miei, fino a quando non sono riuscito a scrivere, quindi non so se è il metodo più ortodosso !!!
Avrai un oggetto di tipo "TSQLQuery", che nel mio codice chiamerò "SQLQuery1".
Prima di eseguire "SQLQuery1.Open", ho messo questo:
//Per poter modificare i record tramite DBNavigator1, ho bisogno delle seguenti opzioni:
with SQLQuery1 do begin
ReadOnly:=False;
//UsePrimaryKeyAsKey:=False;
UsePrimaryKeyAsKey:=True;
PacketRecords:=-1; //https://wiki.freepascal.org/mssqlconn#Error_20019_:_Attempt_to_initiate_a_new_Adaptive_Server_operation_with_results_pending
UpdateMode:=upWhereChanged;
end;
Ho poi aggiunto la gestione dell'evento "SQLQuery1AfterPost", che ho compilato così:
//Usata quando (TipoApertDB = tadScrivi)
try
SQLQuery1.ApplyUpdates;
if (1 = 2) then begin
SQLTransaction1.Commit; //A differenza di CommitRetaining, chiude la conenssione subito dopo aver committato
GestVislTabella(Self); //Visto quanto scritto qui sopra, ricarico la tabella
end else begin
SQLTransaction1.CommitRetaining; //Fa la commit, e tiene attiva la connessione
end;
except
on E: Exception do begin
EmettiErrore(0, 'ERRORE: ' +
LineEnding +
E.Message);
//Ricarico i dati della tabella.
//Se non lo facessi, l'utente vedrebbe in griglia anche i valori che non sono stati salvati !!!
GestVislTabella(Self);
end;
end;
Ripeto: non so se sia il metodo più corretto, ma funziona.
P.S. Per quanto riguarda il componente Zeos, io sono uno di quelli che non lo usa, e fino ad ora me la sono cavata senza !!!
Ciao, Mario
Ciao, intanto vi ringrazio tutti e due
@xinyiman ho fatto così:
procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
begin
SQLQuery1.ApplyUpdates();
end;
Non mi da più errore ma non va ancora a modificare il database
@bonmario perdonami ma sono proprio ai primi passi. Non ho scritto codice, ho fatto tutto da grafica. Non so dove "incastrare" il tuo codice, in unit1 non trovo "SQLQuery1.Open" perchè appunto credo venga eseguito dai componenti. vedo di studiare non mollo.
Allora con poche semplici modifiche funziona. Se vuoi puoi ignorare il form create e il form destroy, ma io preferisco caricare le connessioni così.
Poi ti bastava aggiungere la linea
Self.SQLTransaction1.CommitRetaining;
La differenza tra Commit e CommitRetaining è che la prima salva i dati e chiude la connessione, la seconda salva i dati e mantiene la connessione aperta.
procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
begin
Form1.SQLQuery1.ApplyUpdates();
Self.SQLTransaction1.CommitRetaining;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.SQLite3Connection1.DatabaseName := Application.Location + 'prova1.db';
Self.SQLite3Connection1.Open;
Self.SQLTransaction1.Active:=true;
Self.SQLQuery1.SQL.Text:='select * from clienti order by cognome ;';
Self.SQLQuery1.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Self.SQLQuery1.Active then
Self.SQLQuery1.Close;
if Self.SQLTransaction1.Active then
Self.SQLTransaction1.Active := false;
if Self.SQLite3Connection1.Connected then
Self.SQLite3Connection1.Close();
end;
Controlla questa stringa SQLite3Connection1.ExecuteDirect('CREATE TABLE "libri"('+
'"ID" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
' "Autore" TEXT(30) NULL,'+
' "Titolo" TEXT(30) NULL,'+
' "Prestato" TEXT(50) NULL,');
non sembra completa. Finisce per "," e non ")".Così a prima vista.