现在的位置: 首页 > 综合 > 正文

(DELPHI_XE)Datasnap ‘ERROR_CODE’. The allowed range is 0 to 4294967295′

2013年01月14日 ⁄ 综合 ⁄ 共 1007字 ⁄ 字号 评论关闭

在用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。

抱歉!评论已关闭.