Delphi 陷阱密钥冲突
嗨,我正在尝试做一些异常处理,并截获一个重复的字段值(键冲突)错误。从我寻找解决方案的过程中,我看到了许多使用Delphi 陷阱密钥冲突,delphi,delphi-7,ado,Delphi,Delphi 7,Ado,嗨,我正在尝试做一些异常处理,并截获一个重复的字段值(键冲突)错误。从我寻找解决方案的过程中,我看到了许多使用 try (enter code) except on E: EDatabaseError do showmessage (Error message); end; 但我想特别对密钥冲突作出响应,它使用ADO访问表。如果您要处理的唯一错误是带有“重复值”消息的错误,则这将起作用: try // Your code except on E: EOleException do
try
(enter code)
except on E: EDatabaseError do
showmessage (Error message);
end;
但我想特别对密钥冲突作出响应,它使用ADO访问表。如果您要处理的唯一错误是带有“重复值”消息的错误,则这将起作用:
try
// Your code
except
on E: EOleException do
begin
// The better way is to find out what E.ErrorCode is
// for this specific exception, and handle it instead
// of checking the string - you didn't provide the
// ErrorCode, though.
// If E.ErrorCode = <whatever> then
//
if Pos('duplicate value', E.Message) > 0 then
// You've got a duplicate with the message above
// Do whatever handles it
else
raise;
end;
// If you want to handle other exception types (eg., EDataBaseError),
// you can do so here:
// on E: EDataBaseError do
// HandleDBError;
end;
试试看
//你的代码
除了
关于E:EOleException do
开始
//更好的方法是找出E.ErrorCode是什么
//对于此特定异常,并改为处理它
//检查字符串的方法-您没有提供
//错误代码。
//如果E.ErrorCode=则
//
如果Pos('duplicate value',E.Message)>0,则
//你有一个上面信息的副本
//做任何能处理它的事
其他的
提高;
结束;
//如果您想处理其他异常类型(例如EDataBaseError),
//您可以在此处执行此操作:
//关于E:EDataBaseError do
//HandleDBError;
结束;
根据您的描述,这听起来不像是您应该让它作为一个例外。特别是如果你只需要执行EOleException
。例外情况应该是你没有一个好的方法来处理的事情,这里不是这样
我建议您在尝试添加新记录之前检查新ID是否尚未使用。或者,正如@TLama所建议的,利用数据库框架中的任何错误处理功能,在异常发生之前将其挂起。EDatabaseError只是一个泛型exoption类,没有关于错误的附加信息,以获取ADO中错误的扩展信息,当引发
密钥冲突
异常时,必须使用该属性获取指定的错误代码,为此,请检查编号
和国家错误
属性
您可以在此处找到有关此主题的更多文档
Pos
行上方的注释:@用户使用调试器或logging@user1277240,只需使异常发生,并在异常代码中执行ShowMessage(格式('ErrorCode:%d',]E.ErrorCode])
获取错误代码;它总是一样的,如果语言改变,消息可能会改变(正如David指出的)。@David,感谢您抓到我上次修订时错过的else raise
。我想我已经添加了它,只是注意到我没有,当我进去编辑它时,它就在那里。我以为我疯了,直到我回去刷新了问题页面,看到了你的编辑。:)@ken事务处理2,你有一点关于1。也许性能问题太大了。我是从编程的角度考虑的,而不是从数据库的角度考虑的。但这很可能是在一些数据库数据服务控制事件中捕捉到的。@TLama,它在哪里捕捉到并不重要。它仍然必须被捕获。@Ken,我说的是正确的ADO控件错误处理,而不是在出现异常时按下按钮并等待;-)例如,TClientDataset
错误可能会得到处理。@TLama对我来说是个不错的地方(如果海报使用的是TADOQuery
)。