2012-12-28 46 views
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

我建議將過程調用和錯誤處理從用戶界面(窗體「Form2」)移到數據模塊中的單獨方法。我還要確保在此方法中不會顯示消息框/對話框,以支持在服務器端(中間層,應用程序服務器等)或非GUI類型應用程序中的使用。

然後,我會使用返回代碼或特定於應用程序的異常來向調用GUI方法報告錯誤。

4

您擁有的代碼非常依賴於數據庫。每個RDBMS都會以不同方式報告這些約束違規。如果您只使用特定數據庫(通過使用ADO對象來判斷),那麼可以檢查errorCode,但是我會在存儲過程本身中封裝這些RDBMS特定的errorCode檢查,然後返回特定於應用程序的錯誤原因碼ans向用戶顯示了一條消息,從而屏蔽了Delphi層免於醜陋的db異常。