Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 数据库约束冲突错误处理_Sql Server_Delphi_Error Handling - Fatal编程技术网

Sql server 数据库约束冲突错误处理

Sql server 数据库约束冲突错误处理,sql-server,delphi,error-handling,Sql Server,Delphi,Error Handling,我仍然不知道如何处理数据库冲突错误。此代码是否提供了最佳的错误处理?或者任何其他处理错误的方法,这也让用户清楚错误发生的原因 procedure TForm2.cxButton1Click(Sender: TObject); var sp:TADOStoredProc; errorMsg : string; begin // sp := TADOStoredProc.Create(nil); try sp.Connection := FOrm1.ADOConnecti

我仍然不知道如何处理数据库冲突错误。此代码是否提供了最佳的错误处理?或者任何其他处理错误的方法,这也让用户清楚错误发生的原因

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对象的使用情况判断),则可以检查yes,errorCode,但是,我会将这些RDBMS特定的错误代码检查封装在存储过程本身中,然后返回我的特定于应用程序的错误原因代码,并向用户显示一条消息,从而将Delphi层从丑陋的db异常中完全屏蔽掉。

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

然后,我将使用返回代码或特定于应用程序的异常向调用GUI方法报告错误