delphi – TCustomADODataSet捕获EOleException(不是EDatabaseEr
在某些情况下(在多用户环境中)当我编辑TADODataSet并发布它时,我得到了ADO引发的异常:
如果我从IDE运行我的程序,异常将引发为EOleException,错误号为-2147217864. 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异常的其他想法感兴趣. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |