使用Midas源码时,发现ClientDataset执行MergeChangeLog后,Delta不为空,跟踪源码,发现TDSBase.ClearChanges代码有问题: ... with FChanges do for I := Count - 1 downto 0 do begin P := List^[I]; SeqNo := P.NewSeqNo; pRecBuf := FRecords.List^[SeqNo]; if ((Attr <> dsRecModified) or (pRecBuf <> pRecOrg)) and (GetRecordRecNo(pRecBuf) = RecOrgNo) then begin DelChange(P); DestroyChangeEntry(P, True, { RollingBack, }DeltaRecs); if (pRecBuf <> pRecOrg) then begin RemoveRecord(SeqNo, pRecBuf, DeltaRecs); end; end; end; ... 由于TChangeInfo.OldSeqNo,TChangeInfo.NewSeqNo和TDeltaRec.RecNo指示的都是FRecords的Index,所以,只有在FRecords有变化时才需要变更,因此源码应该为 .... if ((Attr <> dsRecModified) or (pRecBuf <> pRecOrg)) and (GetRecordRecNo(pRecBuf) = RecOrgNo) then begin DelChange(P); if (pRecBuf <> pRecOrg) then begin RemoveRecord(SeqNo, pRecBuf, DeltaRecs); DestroyChangeEntry(P, True, { RollingBack, }DeltaRecs); Dec(RecNo); end; end; .... 另外,RemoceRecord过程中的修改DeltaRecs[i].RecNo的代码要去除。