数据库约束违规错误处理

3

我仍然不清楚如何处理数据库违规错误。这段代码是否提供了最佳的错误处理方式?还有其他处理错误的方法,能够让用户清楚地知道为什么出现错误吗?

procedure TForm2.cxButton1Click(Sender: TObject);
var
  sp:TADOStoredProc;
  errorMsg : string;
begin
  //
  sp := TADOStoredProc.Create(nil);
  try
    sp.Connection := FOrm1.ADOConnection1;
    sp.ProcedureName := 'cfg.AddConfiguration';
    sp.Parameters.CreateParameter('@RETURN_VALUE', TFieldType.ftInteger, pdReturnValue, 0, 0);
    sp.Parameters.CreateParameter('@key', ftString, pdInput, 50, cxTextEdit1.Text);
    sp.Parameters.CreateParameter('@caption', ftString, pdInput, 50, cxTextEdit2.Text);
    sp.Parameters.CreateParameter('@datatype', ftString, pdInput, 50, cxComboBox1.Text);
    sp.Parameters.CreateParameter('@description', ftString, pdInput, 4000, cxMemo1.Text);
    try
      sp.ExecProc;
    except
      on e:EOleException do
      begin
        errorMsg := 'Failed to add new configuration.';
        if e.ErrorCode = 2601 then
        begin
          errorMsg := errorMsg + sLineBreak + 'Possible duplicate in key!';
        end;
        MessageDlg(errorMsg, mtError, [mbOK], 0);
      end;
    end;
  finally
    sp.Free;
  end;
end;
2个回答

4
您的代码非常依赖于数据库。每个RDBMS都以不同的方式报告这些约束违规。如果您只使用特定的数据库(根据ADO对象的使用情况判断),那么是的,errorCode可以检查,但我会在存储过程本身中封装这些特定于RDBMS的errorCode检查,然后返回我的应用程序特定的错误原因代码,并显示一个消息给用户,从而完全屏蔽Delphi层不良的数据库异常。

2
我建议将过程调用和错误处理从用户界面(表单“Form2”)移动到数据模块中的单独方法。我还会确保在此方法中不会显示任何消息框/对话框,以支持在服务器端(中间层、应用服务器等)或非GUI类型的应用程序中使用。
然后,我会使用返回代码或特定于应用程序的异常来向调用GUI方法报告错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接