陷阱密钥违规

时间:2012-04-15 20:28:10

标签: delphi delphi-7 ado

您好我正在尝试进行一些异常处理并拦截重复的字段值(密钥冲突)错误。从我寻找解决方案我已经看到许多使用

捕获所有错误的建议
try
(enter code)
except on E: EDatabaseError do
showmessage (Error message);
end; 

但我想特别回应一个密钥违规,它使用ADO访问表。

3 个答案:

答案 0 :(得分:7)

如果您想要处理的唯一错误是带有“重复值”消息的错误,这将有效:

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;

答案 1 :(得分:6)

EDatabaseError只是一个通用的excption类,没有关于错误的其他信息,为了获得有关ADO中错误的扩展信息,必须使用TADOConnection.Errors属性来获取特定的错误代码。引发Key violation异常,对此NumberNativeError属性进行检查。

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

答案 2 :(得分:3)

根据你的描述,这听起来不像你应该得到的异常。特别是如果你只需要EOleException。例外情况应该是你没有好办法处理的事情,而这种情况并非如此。

我建议您在尝试添加新记录之前检查新ID是否尚未使用。或者,正如@TLama建议的那样,利用数据库框架的任何错误处理工具,可以在它成为异常之前将其挂钩。