在用ADO+TClientDataSet操作数据库时,用DataSetProvider.ApplyUpdates更新时
可能会因为某种错误而提示如下:
Project Project1.exe raised exception class EDatabaseError with message '-2147217900 is not a valid value for field 'ERROR_CODE'. The allowed range is 0 to 4294967295'.
跟踪发现错误在 Provider.pas 中
procedure TUpdateTree.InitErrorPacket(E: EUpdateError; Response: TResolverResponse); var TrueRecNo: LongWord; begin with ErrorDS do begin if Assigned(Parent) then Parent.InitErrorPacket(nil, rrSkip); Self.Delta.UpdateCursorPos; Self.Delta.DSCursor.GetRecordNumber(TrueRecNo); if not Locate('ERROR_RECORDNO', Integer(TrueRecNo), []) then Append else Edit; if not Assigned(E) then begin if Response = rrSkip then begin SetFields([TrueRecNo]); Post; end else SetFields([TrueRecNo, 0, '', '', 0, 0]); end else SetFields([TrueRecNo, Ord(Response)+1, E.Message, '', 1, E.ErrorCode]); end; end;
的
SetFields([TrueRecNo, Ord(Response)+1, E.Message, '', 1, E.ErrorCode]);
这一句,只需要将这一句改成
SetFields([TrueRecNo, Ord(Response)+1, E.Message, '', 1, Variant(LongWord(E.ErrorCode))]);
即可。
因为delphi认为ErrorCode应该是LongWord,不应该出现负数,或者说SQLServer是使用int64来表示ErrorCode。