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レイヤーを醜いdb例外から完全に保護しました。

于 2012-12-28T01:44:40.657 に答える
2

プロシージャの呼び出しとエラー処理をユーザーインターフェイス(フォーム「Form2」)からデータモジュールの別のメソッドに移動することをお勧めします。また、サーバー側(中間層、アプリケーションサーバーなど)または非GUIタイプのアプリでの使用をサポートするために、このメソッド内からメッセージボックス/ダイアログが表示されないようにします。

次に、戻りコードまたはアプリケーション固有の例外のいずれかを使用して、呼び出し元のGUIメソッドにエラーを報告します。

于 2012-12-28T08:15:30.227 に答える