2016-07-03 46 views
5

Il progetto My Delphi dispone di dati di accesso TAdoQuery su un server MS Sql Server 2014 e TClientDataSet che riceve i dati AdoQuery tramite un TDataSetProvider. Questo viene creato da un modello di progetto che ho impostato.TClientDataSet.ApplyUpdates() non applica gli aggiornamenti

Normalmente, ho trovato questo set-up per funzionare senza problemi, ma con questo particolare progetto sto avendo un problema: ApplyUpdates() fallisce silenziosamente e i dati del server Sql non vengono aggiornati. Nel mio ridotta progetto di debug, l'unico codice che ho, a parte un gestore del pulsante del mouse, che lo chiama, è:

procedure TForm1.ApplyUpdates; 
var 
    Errors : Integer; 
begin 
    Errors := ClientDataSet1.ApplyUpdates(0); 
    Caption := IntToStr(Errors) + '/' + IntToStr(ClientDataSet1.ChangeCount); 
end; 

Dopo questo viene eseguito, la didascalia del modulo dovrebbe essere 0/0, naturalmente, ma quello che in realtà dice è 0/1. Quindi, a prima vista, non si sono verificati errori ma i CDS ChangeCount non sono stati ripristinati a zero come dovrebbe essere. La mia q è, in che modo ApplyUpdates non restituisce errori, ma il set di dati del server non viene aggiornato.

Fwiw, ho aggiunto il display ChangeCount come parte del mio impegno per il debug del problema. Ma temo di non essere stato in grado di seguire ciò che dovrebbe succedere nei dettagli della "conversazione" tra DataSetProvider e il suo DataSet per applicare gli aggiornamenti sul server.

+1

Hai aggiunto il codice per il gestore errori OnReconcileError? – mjn

risposta

5

Recentemente mi sono imbattuto in questo problema su un progetto rapido che ho frugato senza la precauzione di impostare un gestore OnReconcileError, come richiesto da @mjn.

Una volta impostato il gestore OnReconcileError, era ovvio che il problema era che TSqlResolver del provider non era in grado di identificare la riga da aggiornare. Iirc, il messaggio sul modulo a comparsa ReconcileError era parole con l'effetto di "Impossibile individuare il record .Nessun tasto specificato".

Quindi, prima cosa che ho provato è stato quello di includere questo nel mio CDS dopo Open:

CDS1.Fields[0].ProviderFlags := [pfInKey]; 

(CDS1.Fields [0] è il campo PK del set di dati)

Contrariamente alle mie aspettative, questo non l'ha risolto Dopo avermi grattato la testa per un po ', ho dato un'occhiata attenta al server e ho scoperto che la tabella appena ricreata che stavo usando non aveva un indice di chiave primaria.

Dopo aver creato l'indice della chiave primaria sul server, il problema di ApplyUpdates è andato via.

Tuttavia, ciò che mi lascia perplesso su questo è quello richiesto dalla tua q, ho lasciato cadere l'indice della chiave primaria sulla mia tabella server e il problema non si è ancora verificato (!). Suppongo che questo sia dovuto ad un qualche tipo di effetto di cache sulla mia macchina ma non voglio davvero riavviarlo adesso per investigare.

Problemi correlati