2016-03-26 6 views
-1

SQL Serverデータベースにデータを挿入するためのストアドプロシージャがあります。私はクライアントからデータを受け取り、DBにデータを挿入するWCFサービスを使用しています。私は私のDBテーブルの名前列にユニークなキー制約を持っています。DbまたはC#コードの方が処理が優れていますか?

任意の一意キー制約エラーがある場合:

  1. 私が扱うストアドプロシージャのもの。たとえばSQL Serverにif existsステートメントを使用し、値がある場合は-1を返します。それ以外の場合は、dbを行に挿入する必要があります。

  2. 私は(WCFサービス)C#コードでそれを処理します。私はSQL例外を取得し、クライアントにSQL例外コードを返します。

最初の解決策では、ユニークなキー制約が2回チェックされるため、パフォーマンスの問題があると思います。初めて私はストアドプロシージャ内でそれを手動でチェックしていて、2回目にユニークキーの制約がそれを再度チェックします。したがって、1つの値が2回チェックされています。

2番目の解決例外では、wcfサービスではC#コードを使用して処理されていますが、wcfの例外はそれほど良くないと聞いています。

最適なソリューションは何ですか?

+0

例外処理コードをC#コードに適用してください。これは良い方法です – iOS

答えて

2

「ベター」はここではちょっと主観的なもので、どのような「より良い」ものが好きですか。おそらく、あなたはパフォーマンスの観点から意味ならば、私はオプション1が(でも2回)SQL Serverの既存の値のインデックスをチェックする処理するので、実際にはよりパフォーマンスで賭けることをいとわないだろう

  • ます例外を発生させてコードに戻すのに要する時間に比べて小さくなってしまいます。 (それを2回確認する必要はありませんが、T-SQL自体を試してみることはできますが、ユニークキー違反で-1を返すことができます)

  • しかし、私はむしろ読んでいました、開発者(擬似コード)

    として、言い換えれば

に何が起こっているか非常にはっきりしているので、ビューのメンテナンスポイントは、その後、オプション2は、私の意見でははるかに望ましいです

//assuming you have a connection open, a command prepared, etc. 
try 
{ 
    var result=command.ExecuteNonQuery(); 
} 
catch(SqlException ex) 
{ 
    if(ex.Number==2627) 
    { 
     //Unique Key constraint violation. 
     //Error 2627 is documented and well known to be a Unique Key Constraint Violation 
     //so it's immediately obvious what's going on here 
    } 
} 

var result=command.ExecuteNonQuery(); 
if (result==-1) 
{ 
    //this means a unique key violation 
    //what if that comment got removed? I'd have no clue what 
    //-1 meant... 
} 

一見したところでは、2番目のものは短くてサクシンントです。

注:MetroSmurfが指摘しているように、例外をここにキャッチすることは理想的ではなく、呼び出し側が処理する必要があります。これは説明のためです。

これは、ここの-1がストアドプロシージャの部分ではかなり恣意的であるためです。あなたがそれを文書化できることを保証できない限り、この文書は古くなってしまうことはありません。そうすれば、次の開発者がストアドプロシージャを参照しなければならないという負担をかけ、 1は、この意味での意味です。

プラスそれはあなたのC#に触れずにSPを変更するために誰かのために可能なので、何をSPが突然ユニークキー違反のために「42」を返す開始した場合にどうするつもりですか?もちろん、あなたはSPを完全にコントロールすることができますが、それはいつもそうでしょうか?

+1

+1 - データアクセスレイヤではなく、サービスでtry/catch SQLExceptionを実行することをお勧めします。データアクセス層でtry/catch SQLExceptionを妥当に使用するのは、問題を解決するために何らかのアクションを実行できる場合です。それ以外の場合は例外のバブルアップを行い、呼び出し元は例外を管理できます。 –

+1

@ MetroSmurf - まあまあ、コードはほんの一例に過ぎず、メッセージから抽出したくありませんでした。それにもかかわらず - これを明確にする答えを更新しました:) –

関連する問題