gpt4 book ai didi

delphi - TCustomADODataSet 捕获 EOleException(不是 EDatabaseError)

转载 作者:行者123 更新时间:2023-12-03 15:13:33 24 4
gpt4 key购买 nike

在某些情况下(在多用户环境中),当我Edit一个TADODataSetPost它时,我收到一个异常阿多:

"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! (咕噜咕噜)。

我的问题是如何获取原始的 EOleException 以便查询 EOleException.ErrorCode

最佳答案

我尝试利用 System.RaiseList 获取 TRaiseFrame.NextRaise 但无济于事 - 我没有得到所需的 EOleException code>...所以我找到了一个相当优雅的解决方案,它特定于我的案例(ADO)并且不依赖于RTL - 我正在测试Errors对象TADODataSet.Connection 的:

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 的先前异常的其他想法感兴趣。

关于delphi - TCustomADODataSet 捕获 EOleException(不是 EDatabaseError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20948964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com