sql-server - 数据库约束违规错误处理

标签 sql-server delphi error-handling

我仍然困惑如何处理数据库违规错误。这段代码是否提供了最好的错误处理?或者任何其他方法来处理错误,这也让用户清楚为什么会发生错误?

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;

最佳答案

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

关于sql-server - 数据库约束违规错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063520/

相关文章:

sql-server - access和sql server实时同步

.net - .Net:将压缩文件保存到SQL Server?

sql-server - T-SQL First_Value() - 它如何返回多个值?

Delphi TListview OwnerDraw SubItems - 更改默认字体(在 Canvas 上绘制后,它会以某种方式加粗)

android - 如何制作 RxErrorHandlingCallAdapterFactory?

mysql - 在 sql 2012 中自动化存储过程

delphi - 以与文件大小相同的格式获取类或对象的大小?

delphi - 使用 RC.EXE 或 BRCC32.EXE 构建 *.rc 文件时包含文件的行为有所不同

javascript - AJAX 和 JSON 错误处理

ruby-on-rails - PG::ConnectionBad Error when trying to run rake db:migrate 在创建模型后,使用 postgresql