2016-07-03 67 views
5

Mój projekt Delphi ma TAdoQuery uzyskujący dostęp do danych na serwerze MS Sql Server 2014 oraz TClientDataSet, który odbiera dane AdoQuery za pośrednictwem TDataSetProvider. Jest on tworzony z szablonu projektu, który skonfigurowałem.TClientDataSet.ApplyUpdates() nie stosuje aktualizacji

Zwykle znalazłem ten zestaw do pracy bezbłędnie, ale z tym konkretnym projektem mam problem: ApplyUpdates() nie działa w trybie cichym, a dane serwera SQL nie są aktualizowane. W moim okrojona projektu debugowania, tylko kod mam, oprócz obsługi button-click, które nazywa, jest:

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

Po to wykonuje, podpis formularz powinien być 0/0 oczywiście, ale co to właściwie mówi to 0/1. Więc na pierwszy rzut oka nie wystąpił żaden błąd , ale CDS ChangeCount nie został zresetowany do zera, tak jak powinien być. Moje q to, w jaki sposób ApplyUpdates nie może zwracać błędów, ale zestaw danych serwera nie jest aktualizowany.

Fwiw, dodałem wyświetlacz ChangeCount jako część moich starań, aby usunąć problem. Ale obawiam się, że nie byłem w stanie śledzić tego, co powinno się dziać w szczegółach "rozmowy" między DataSetProvider i jego DataSet, aby zastosować aktualizacje na serwerze.

+1

Czy dodano kod dla procedury obsługi błędów OnReconcileError? – mjn

Odpowiedz

5

Wpadłem na ten problem w ostatnim czasie na szybki projekt, który zaszumiałem bez konieczności ustawiania programu obsługi OnReconcileError, o co pytał @mjn.

Po skonfigurowaniu programu obsługi OnReconcileError było oczywiste, że problem polegał na tym, że dostawca TSqlResolver nie był w stanie zidentyfikować wiersza do zaktualizowania. Iirc, komunikat w wyskakującym formularzu ReconcileError zawierał słowa "Nie można zlokalizować rekordu. Nie podano klucza."

Więc pierwszą rzeczą próbowałem było to w moim CDS-tych AfterOpen:

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

(CDS1.Fields [0] jest pole PK zbioru danych)

Wbrew moim oczekiwaniom, to go nie naprawiło. Po krótkim drapaniu głowy, dokładnie obejrzałem serwer i odkryłem, że ostatnio odtworzony stół, z którego korzystałem, nie ma podstawowego indeksu klucza.

Po utworzeniu indeksu kluczy głównych na serwerze problem dotyczący funkcji ApplyUpdates zniknął.

Jednak to, co mnie zastanawia, polega na tym, że monit q spowodował, że upuściłem podstawowy indeks klucza na mojej tablicy serwerów i problem nie zaczął się ponownie pojawiać (!). Zgaduję, że jest to spowodowane działaniem buforującym na moim komputerze, ale nie chcę go teraz ponownie uruchamiać, aby zbadać.

Powiązane problemy