Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 陷阱密钥冲突_Delphi_Delphi 7_Ado - Fatal编程技术网

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中错误的扩展信息,当引发
密钥冲突
异常时,必须使用该属性获取指定的错误代码,为此,请检查
编号
国家错误
属性

您可以在此处找到有关此主题的更多文档


您希望捕获的异常的具体标识是什么?当我使用已经存在的客户端ID(主键)将新客户端添加到系统中并返回以下消息时,-引发异常类EOleException,消息为“您请求的表更改未成功,因为它们将在索引主键中创建重复值,或者关系'如果我再次运行,则返回相同的消息,但带有EDatabaseError而不是EOleExceptionyes,但在错误消息中,我希望能够声明输入的客户端ID已存在,使用“通用例外”可能会捕获与已经存在的客户端ID无关的各种其他错误。请务必查看,例如,在。本地化是否可能导致非英语系统出现此错误?只是一个想法!此外,您的代码会吞并所有EOleException异常。只需更新我的答案,就可以提供一个没有此问题的更好解决方案。请参见
Pos
行上方的注释:@用户使用调试器或logging@user1277240,只需使异常发生,并在异常代码中执行
ShowMessage(格式('ErrorCode:%d',]E.ErrorCode])
获取错误代码;它总是一样的,如果语言改变,消息可能会改变(正如David指出的)。@David,感谢您抓到我上次修订时错过的
else raise
。我想我已经添加了它,只是注意到我没有,当我进去编辑它时,它就在那里。我以为我疯了,直到我回去刷新了问题页面,看到了你的编辑。:)@ken事务处理2,你有一点关于1。也许性能问题太大了。我是从编程的角度考虑的,而不是从数据库的角度考虑的。但这很可能是在一些数据库数据服务控制事件中捕捉到的。@TLama,它在哪里捕捉到并不重要。它仍然必须被捕获。@Ken,我说的是正确的ADO控件错误处理,而不是在出现异常时按下按钮并等待;-)例如,
TClientDataset
错误可能会得到处理。@TLama对我来说是个不错的地方(如果海报使用的是
TADOQuery
)。