加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – TCustomADODataSet捕获EOleException(不是EDatabaseEr

发布时间:2020-12-15 09:47:27 所属栏目:大数据 来源:网络整理
导读:在某些情况下(在多用户环境中)当我编辑TADODataSet并发布它时,我得到了ADO引发的异常: “Row cannot be located for updating. Some values may have been changed since it was last read.” 如果我从IDE运行我的程序,异常将引发为EOleException,错误号为-
在某些情况下(在多用户环境中)当我编辑TADODataSet并发布它时,我得到了ADO引发的异常:

“Row cannot be located for updating. Some values may have been changed
since it was last read.”

如果我从IDE运行我的程序,异常将引发为EOleException,错误号为-2147217864.
我希望能够捕获此异常,但是当我在IDE外部运行程序时,会引发异常,因为EDatabaseError没有我需要检查的ErrorCode.这是我的代码的一部分:

procedure TForm1.DataSetCommit(ds: TADODataSet);
begin
  ds.Connection.BeginTrans;
  try    
    try
      ds.Post; // <- Exception is raised here
    except
      on E: EOleException do; // EOleException is NOT fired! (E.ErrorCode = -2147217864) - see "ADODB.TCustomADODataSet.InternalPost"
      on E: EDatabaseError do 
      begin
        // todo: Handle this situation
      end;
    end;
    ds.Connection.CommitTrans;
  except
    ds.Connection.RollbackTrans;
    raise;
  end;
end;

如果您查看ADODB.TCustomADODataSet.InternalPost,您会注意到它被包装为:

procedure TCustomADODataSet.InternalPost;
begin
  UpdateCursorPos;
  try
    ... // <- Exception is raised here
  except
    on E: Exception do
      DatabaseError(E.Message);
  end;
  CheckForFlyAway;
end;

异常是在本地过程UpdateData内引发的:Recordset.Update(EmptyParam,EmptyParam);它会触发EOleException(我需要的东西),但是包装器会引发EDatabaseError! (grrrrrrr).

我的问题是我如何得到原始的EOleException,所以我可以查询EOleException.ErrorCode?

解决方法

我试图利用System.RaiseList来获取TRaiseFrame.NextRaise无济于事 – 我没有得到所需的EOleException …所以我找到了一个相当优雅的解决方案,这是特定于我的情况(ADO)而不是依赖于RTL – 我正在测试TADODataSet.Connection的Errors对象:

procedure TForm1.DataSetCommit(ds: TADODataSet);
begin
  ds.Connection.BeginTrans;
  try      
    try
      ds.Post;
    except          
      on E: EDatabaseError do 
      begin          
        if Assigned(ds.Connection.Errors) and (ds.Connection.Errors.Count > 0) then
          with ds.Connection.Errors.Item[0] do
            // if (Number = -2147217864) then ...
            ShowMessage(Format('Number:%d; Source:%s; Description:%s; NativeError:%d; SQLState:%s',[Number,Source,Description,NativeError,SQLState]));
      end;
    end;
    ds.Connection.CommitTrans;
  except
    ds.Connection.RollbackTrans;
    raise;
  end;
end;

这将是我对特定问题的解决方案,但我仍然对如何捕获以前的EOleException异常的其他想法感兴趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读