我仍然困惑如何处理数据库违规错误。这段代码是否提供了最佳的错误处理?或者任何其他处理错误的方法,这也使用户清楚为什么会发生错误?
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;
答案 0 :(得分:4)
您拥有的代码非常依赖于数据库。每个RDBMS都以不同方式报告这些约束违规。如果您只使用特定数据库(根据ADO对象的使用情况判断),那么可以检查errorCode,但是我会在存储过程本身中封装这些特定于RDBMS的errorCode检查,然后返回我的特定于应用程序的错误原因代码ans向用户显示了一条消息,从而完全屏蔽了Delphi层与丑陋的db异常。
答案 1 :(得分:2)
我建议将过程调用和错误处理从用户界面(“Form2”形式)移到数据模块中的单独方法。我还要确保在此方法中不会显示任何消息框/对话框,以支持服务器端(中间层,应用程序服务器等)或非GUI类型应用程序的使用。
然后我会使用返回代码或特定于应用程序的异常来向调用GUI方法报告错误。