Ciao,
non ho mai utilizzato Delphi, cosa sarebbe l'oggetto TTable?
Per provare comunque a rispondere alle tue domande, io lavoro sui DB senza usare componenti esterni, e faccio tutto con gli oggetti messi a disposizione "nativamente" da Lazarus, e fino ad ora non sento la mancanza di altro !!!
Normalmente uso questi 4 oggetti per connettermi ai DB:
DBGrid1: TDBGrid;
SQLConnector1: TSQLConnector;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
Attualmente ho un solo progetto in cui devo scrivere sul DB. Le varie scritture/cancellazioni, vengono fatte tramite l'oggetto DBNavigator.
In testa ho questo:
//Per poter modificare i record tramite DBNavigator1, ho bisogno delle seguenti opzioni:
SQLQuery1.ReadOnly:=False;
SQLQuery1.UsePrimaryKeyAsKey:=True;
SQLQuery1.PacketRecords:=-1; //https://wiki.freepascal.org/mssqlconn#Error_20019_:_Attempt_to_initiate_a_new_Adaptive_Server_operation_with_results_pending
SQLQuery1.UpdateMode:=upWhereChanged;
Scritto prima di fare la
La scrittura vera e propria, viene fatta tramite la proprietà "AfterPost" dell'oggetto TSqlQuery.
Qui il codice che uso:
procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
begin
//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;
end;
Ciao, Mario
Ciao,
anche io lavoro con i componenti nativi, in Mysql e anch'io provengo da Delphi.
Per poter salvare devi soltanto:
Preso il campo chiave primaria della tsqlquery, devi settare, per la proprietà ProviderFlags, pfInKey=true, altrimenti non salva.
Per salvare le modifiche fatte:
tsqlquery1.applyupdates;
tmysql57connection1.Transaction.CommitRetaining;
Nell'Ide, anche a me raramente dà access violation all'apertura della query ma poi funziona tutto lo stesso, in esecuzione nessun problema. Ancora non ho capito il perché.
Se poi hai due tabelle in master-detail basta aggiornare la query della tabella detail "on change" del campo chiave della tabella master.
Spero di essere stato chiaro e di aiuto,
buon lavoro.