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;
4

2 回答 2

4

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

于 2012-12-28T01:44:40.657 回答
2

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

然后我会使用返回码或应用程序特定的异常来向调用 GUI 方法报告错误。

于 2012-12-28T08:15:30.227 回答