【问题标题】:Delphi find specific cause for ExceptionDelphi找到异常的具体原因
【发布时间】:2012-04-19 13:32:03
【问题描述】:

我有一个连接数据库的应用程序。
使用 BDE 组件和数据库连接的是 MySQL。

现在我正在做一些验证,以检查执行插入语句时是否重复条目。

以下是检查主键属性是否重复条目的代码。

var
  error :string; 
  cmpres:integer;
begin
 ...
 /* all my data queries */
  try
    Query1.ExecSQL;
  Except
   on E: Exception do
   /*check if its a Duplicate entry or other exception*/
    begin    
         error := E.Message;
         error := copy(error,length(error)-16,length(error)-2);
         cmpres :=CompareStr(LowerCase(error),'for key '+#39+'primary'+#39) ;
         if cmpres = 0  then
           MessageDlg('Entry already exist',mtError,[mbok],0)
         else
           MessageDlg('Invalid Data Entries',mtError,[mbok],0);
         exit;
    end;
  end;
end; 

数据库异常大体上放在EDatabaseError里面

谁能告诉我有什么方法可以在不进行消息比较的情况下区分这些错误。
提前致谢

【问题讨论】:

  • 调试器告诉你什么?
  • @DavidHeffernan 调试器给我这个错误消息error 'Key violation.'#$D#$A'[MySQL][ODBC 5.1 Driver][mysqld-5.5.11]Duplicate entry ''64'' for key ''PRIMARY''''
  • 不,我的意思是 class 是什么错误,该类为您提供了哪些属性。
  • TQueryOnPostError 事件,您应该在其中捕获异常。我知道这里有人建议比较此错误消息文本,但这样做的方法是错误的。我无法想象是否有人会翻译这些信息。看看例如在this article,它不仅与ADO相关,您也可以将技术修改为BDE。
  • @Shirish11 阅读这篇文章。它充满了代码。

标签: mysql delphi exception delphi-2010


【解决方案1】:

如果您使用的是 BDE,则异常应该是 EDBEngineError,而不是 EDatabaseError。你可以这样做:

try
    Query1.ExecSQL;
except
    on E: EDBEngineError do
    begin
        for i := 0 to E.ErrorCount - 1 do
        begin
            err := E.Errors[i];
            case err.ErrorCode of
                ... stuff ...
            end;
        end
    end;
end

【讨论】:

  • 这适用于其他数据库组件和数据库吗?
  • 看起来像。你应该可以很容易地检查(如果 E 是 EDBEngineError)然后 ...
猜你喜欢
  • 2010-12-19
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2012-03-10
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多