2016-07-03 18 views
5

My Delphi 프로젝트에는 MS Sql Server 2014 서버에 대한 TAdoQuery 액세스 데이터와 TDataSetProvider를 통해 AdoQuery 데이터를받는 TClientDataSet이 있습니다. 이것은 내가 설정 한 프로젝트 템플릿에서 생성됩니다.TClientDataSet.ApplyUpdates()가 업데이트를 적용하지 않습니다.

일반적으로이 설정은 문제없이 작동하지만이 특정 프로젝트에서는 ApplyUpdates()가 자동으로 실패하고 Sql Server 데이터가 업데이트되지 않습니다. 내 옷을 벗었 디버깅 프로젝트, 내가 가진 유일한 코드에서 떨어져를 호출하는 버튼 클릭 핸들러에서이다 :이 실행 된 후

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

, 폼의 캡션은 물론 0/0 수 있지만, 실제로 말씀한다 0/1입니다. 그래서 그것의 얼굴에, 아무런 오류도 발생하지 않았습니다. 그러나 CDS ChangeCount은 반드시 0으로 재설정되지 않았습니다. 내 질문은, 어떻게 ApplyUpdates 오류를 반환 할 수 있지만 서버 데이터 집합이 업데이트되지 않습니다.

Fwiw, 문제를 디버그하기위한 노력의 일환으로 ChangeCount 디스플레이를 추가했습니다. 그러나 나는 서버에서 업데이트를 적용하기 위해 DataSetProvider와 DataSet 간의 "대화"에 대한 세부 사항에서 진행될 작업을 수행 할 수 없었습니다.

+1

오류 처리기 OnReconcileError에 대한 코드를 추가 했습니까? – mjn

답변

5

@mjn이 쿼리 한 OnReconcileError 핸들러를 설정하지 않아도 빠른 프로젝트에서이 문제가 최근에 발생했습니다.

일단 OnReconcileError 처리기를 설정하면 공급자의 TSqlResolver가 업데이트 할 행을 식별 할 수 없다는 것이 분명했습니다. Iirc, ReconcileError 팝업 양식의 메시지는 "레코드를 찾을 수 없습니다. 키를 지정하지 않았습니다."라는 단어입니다.

그래서, 내가 노력 제일 먼저 AfterOpen 내 CDS 년대에이를 포함했다 :

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

나의 기대에

달리 (CDS1.Fields [0] 데이터 세트의 PK 필드입니다) 그것은 그것을 고치지 않았다. 잠시 동안 머리를 긁적 거리며 서버를 신중히 살펴본 결과 최근에 재 작성된 테이블에 기본 키 인덱스가 없다는 것을 발견했습니다.

일단 서버에서 기본 키 색인을 생성하면 ApplyUpdates 문제가 해결되었습니다.

그러나이 질문에 대한 답은 q로 표시됩니다. 서버 테이블에 기본 키 인덱스를 놓았으며 문제가 다시 발생하지 않았습니다 (!). 나는 이것이 내 컴퓨터에서 어떤 종류의 캐시 효과에 의한 것 같지만 지금은 조사하기 위해 재부팅하고 싶지 않습니다.