Cerco di essere più chiaro...

Ho sviluppato questa piccola applicazione utilizzando

SQLDATASET -> DATASETPROVIDER -> CLIENTDATASET

in questa applicazione la chiave primaria deve essere inserita manualmente (di solito preferisco crearla autoincrementante ma me l'hanno chiesta così), sorge inevitabile un controllo sulla stessa.

Naturalmente, nel momento che si cerca di inserire una chiave primaria già presente, il metodo "ApplyUpdate" fallisce, viene lanciata l'eccezione e il record viene però inserito lo stesso, non fisicamente sul Database ma in memoria, siccome il componente CLIENTDATASET opera proprio in memoria. Questo è un comportamento normale. Ho deciso allora di scrivere un evento "OnPostError" del CLIENTDATASET in modo da gestire l'errore (sempre in memoria).

procedure TForm1.ClientDataSet1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
ShowMessage('Errore sull'inserimento'');
Action := daAbort;

ClientDataSet1.RevertRecord;
end;

In questo modo, lancio un messaggio di errore (siccome la chiamata al metodo UpplyUpdate fallisce) e con il metodo:

"ClientDataSet1.RevertRecord;"

faccio in modo di tornare alla situazione in memoria prima della chiamata di UpplyUpdate

In questo modo, non solo viene avvertito l'utente che un errore è stato generato (in questo caso la chiave primaria duplicata), ma evita di scrivere nel ClientDataset il nuovo record che sarebbe inesatto siccome avrebbe una chiave primaria già utlizzata.

Stiamo sempre parlando di memoria poichè, a priori, come è logico che sia il Database non inserisce mai il record con la chiave primaria duplicata e questo è il comporamento che ci si aspetta.

Il problema era gestire il ClientDataset che opera in memoria e credevo di avercela fatta.

Le prove che ho fatto, forse le ho scritte in modo confusionale, sono dettate dal fatto che, dopo averci sbattuto la testa e non riuscendo a capire, mi sono reso conto che l'errore me lo dava Firebird Embedded ma non ne ero sicuro così ho chiesto aiuto (è la prima volta che utilizzo Firebird in generale).

Per la mia applicazione ho utilizzato la versione "non embedded". Tutte le applicazioni Delphi sono naturalmente compilate, ma come avevo detto, ho copiato tutte le librerie e il file EXE in una cartella esterna per verificare il funzionamento della versione embedded su un altro PC... lo scopo era proprio questo . Far funzionare l'applicazione su un computer su cui non era installato Firebrid e capire come funzionava la versione Embedded.

Dalla documentazione di Firebird ho letto che dovevo rinominare la libreria

"fbembed.dll" in ""gds32.dll"

Tutto andò bene, su un altro pc(senza server firebird) il programma funziona correttamente tranne per un cosa.....
nell'inserimento di una chiave primaria già utilizzata non compare il mio mesasggio di errore personale e in più viene inserito il record corrispondente (sempre in memoria.... nel database non ci sono modifiche).

Ho provato allora a cercare l'errore e da qui il mio continuo fermare e attivare il server. Magari era inutile ma volevo essere sicuro.

Praticamente il comportamento da me progettato e sperato (l'invio del mio messaggio di errore e non inserimento del record me lo da se utilizzo il server Firebird)... se provo ad utilizzare la versione embedded ecco che tutto non funziona....

Penso di essere stato + chiaro e preciso....

Immagino che sia inutile fermare il server firebird se in una cartella c'è già la libreira del Firebird Embedded, penso che venga vista prima lei, ma volevo essere sicuro per avere la certezza....

Magari tutto dipende da un errore mio di progettazione non so....

Ringrazio per l'attenzione e per l'aiuto...

Ciao