Newsgroup: it.comp.lang.delphi
Titolo: Key violation al refetch su clientdataset: Bug driver Firebird (dbExpress) oppure configurazione errata ?

Salve,
sto lavorando con Delphi 2005 e un database Firebird, sfruttando tecnologia 
dbExpress con Provider e ClientDataset.
Mi trovo ad avere una connessione al database SQLDB, un provider P, un 
client-dataset master M ed un client-dataset di dettaglio annidato D nel 
client-dataset master:
- SQLDB: TSQLConnection
- P: TDataSetProvider
- M: TClientDataset
- D: TClientDataset
Ho impostato le seguenti proprieta come indicato sotto:
- P.Options := P.Options + [poFetchDetailsOnDemand]; (DUNQUE 
poFetchDetailsOnDemand a TRUE)
- M.FetchOnDemand := True;
- M.PacketRecord := 20;
- D.FetchOnDemand := True;
- D.PacketRecord := 1;
Ecco cosa succede:
In fase di recupero (fetch) dei record di M da 1 a 20 tutto fila liscio,
ma non appena il provider tenta di recuperare i record successivi
e cioè quelli da 21 a 40 si verifica un "key violation", perchè a quanto
pare il server FIREBIRD tenta di restituire al PROVIDER nuovamente
gli stessi record da 1 a 20 anzichè quelli da 21 a 40 come se si fosse
perso il posizionamento del cursore dopo il primo fetch dei record di M.
Questo comportamento (con conseguente "key violation")
non si verifica se imposto D.FetchOnDemand := False;
Il "key violation" deriva dal tentativo di inserimento da parte del provider
nel client-dataset di record che sono già presenti e che avendo una chiave
primaria non possono essere ovviamente duplicati.
La chiave primaria è impostata tramite la proprietà seguente sul Field 
corrispondente:
TField.ProviderFlags := TField.ProviderFlags + [pfInKey].
Deduco che tale problema sia indirettamente provocato dall'esigenza del 
provider
di recuperare anche i dettagli D tra la prima (record da 1 a 20) e la 
seconda chiamata
(record da 21 a 40) del fetch dei record di M.
Vi chiedo gentilmente, sperando che qualcuno di voi abbia già riscontrato e 
risolto il problema,
come poter intervenire... sempre che non si tratti di un bug di dbexpress o 
del driver firebird.
Poichè ritengo che il problema possa dipendere dalla configurazione 
utilizzata per il driver firebird
per dbexpress, vi posto di seguito le impostazioni salienti dell'oggetto 
SQLDB:
    SQLDB.DriverName          := 'Interbase';
    SQLDB.GetDriverFunc       := 'getSQLDriverINTERBASE';
    SQLDB.KeepConnection      := True;
    SQLDB.LibraryName         := 'dbexpint.dll';
    SQLDB.LoadParamsOnConnect := False;
    SQLDB.LoginPrompt         := False;
    SQLDB.VendorLib           := 'fbclient.dll';
    SQLDB.Params.Clear;
    SQLDB.Params.Add('BlobSize=-1');
    SQLDB.Params.Add('CommitRetain=False');
    SQLDB.Params.Add('DriverName=Interbase');
    SQLDB.Params.Add('ErrorResourceFile=');
    SQLDB.Params.Add('LocaleCode=0000');
    SQLDB.Params.Add('ServerCharSet=');
    SQLDB.Params.Add('SQLDialect=3');
    SQLDB.Params.Add('Interbase TransIsolation=ReadCommited');
    SQLDB.Params.Add('WaitOnLocks=True');
    SQLDB.Params.Add(Format('Database=%s:%s',['localhost','C:\database.fdb']));
    SQLDB.Params.Add(Format('User_Name=',['sysdba']));
    SQLDB.Params.Add(Format('Password=%s',['masterkey']));
    SQLDB.Params.Add(Format('RoleName=%s',['']));
Grazie a tutti per l'attenzione e scusate per la lunghezza del post.
Riccardo
-- 
* Immolo - Motore di ricerca per annunci immobiliari
* web: 
http://www.immolo.it

 Bill Todd (TeamB)
Saluti,
