2012-10-05 14 views
8

多くのインラインSQLクエリを使用するasp.net Webサイトで作業しています...その場でインラインクエリを作成するのが最善かどうか疑問です:インラインSQLクエリのベストプラクティス

int i = 500; 

    using (SqlConnection conn = new SqlConnection(connStr)) 
    { 
     SqlCommand com = new SqlCommand(conn); 
     ... 
     com.CommandText = "select from table where column < @parameter"; 
     ... 
    } 

または、アプリケーションに必要なすべてのクエリを保持するクラスを持つこと。このようなもの:

class SqlQueries 
{ 
    private string query1 = 
      "select * from tblEmployees where EmployeeName = @EmployeeName"; 

    private string query2 = 
      "select * from tblVacation where EmployeeName = @EmployeeName"; 

    public string Query(string s) 
    { 
     string str = string.Empty; 

      switch (s) 
      { 
       case "query1": 
        str = query1; 
        break; 
       case "query2": 
        str = query2; 
        break; 
      }  

    return str;  

    } 
} 

ありがとうございます!

+1

インダイレクションアプローチ番号2を使用する場合は、SQLを含むクエリ名でインデックスされた辞書を作成することをお勧めします。次に、辞書の初期化子を使用して、すべてのクエリをソースコードのほぼテーブルのようにリストすることができます。あなたの現在のアプローチは冗長で、コピー・ペースト・エラーの影響を受けやすい(現時点では、少なくともコンパイラによって発見されるものが少なくとも1つあります)。新しい辞書 {{"query1"、 "select * ..."}、{"query2"、 "select * ..."}}; ' –

+0

ありがとう皆さん!あまりにも私は複数の答えを選択することはできません:( – user1481183

答えて

7

私は1日に多くのADO.NETクエリを使用しました。私はいつも最初の方法を使用してきました。 2番目の方法は興味深い考えですが、コード内の他の場所にいる場合は、それらのクエリを編集するのは面倒かもしれません。また、コード内の特定の場所でクエリが何をしているのかを知ることも難しくなります。例:

string sql = "Update User set age = @age where UserId = @UserId"; 

は一方で、何が起こっているかを開発者に伝えます:

string sql = SqlQueries.Query("updateAge"); 

は、テーブル/カラムが更新されているかについての質問を残します。また、最初のものでは、追加する必要があるパラメータを正確に把握しています。

あなたは両方のケースでは、あなたが最終的にあなたがCommandTextに渡すStringを取得/構築しているもの

0

複数の場所で繰り返されない限り、「インライン」というクエリを使用することは問題ありません。それが起こり始めると、Queryクラスの作成を開始することができます。

5

リテラルをメソッドに直接置くのは難しいことではありません。そのクエリを実行するたびに常に同じメソッドを呼び出す必要があります。ただし、文字列リテラルをコード内の複数の場所にコピーする場合は、定数が確実に優先されます。しかし、2番目の例のQueryメソッドの引数として文字列を取るのではなく、列挙値を取る必要があります。

ただし、説明した2番目の方法を使用している場合は、代わりにストアドプロシージャを使用するだけではない理由が尋ねられます。

+1

ストアドプロックスの良い点 –

+0

@スチューンドッグガート - 私の場合は、2つの理由:DBに管理者権限を持つ人が多すぎるクエリをソース管理下に保つ。 – user1481183

0

を変えるかもしれないいくつかの場所でこのクエリを記述している場合。そのような違いはありません。あなたのケースで考慮する必要があるのは、コードをどのように維持するか、他の人がどのようにコードを理解するかだけです。

0

少なくともインラインSQLを使用する場合は、データベースの変更を行ってその影響を知るために苦痛を伴うため、少なくともWebページコードには入れないでください。すべてのクエリを1つのクラスにまとめるのはちょっと混乱しているかもしれませんが、機能クラス(ビジネスオブジェクトのマネージャクラスなど)でグループ化した方が処理が簡単です。

4

ハードコードされたインラインクエリよりも、問題の解決策としてストアドプロシージャを使用することをお勧めします。後でクエリを変更する必要がある場合は、アプリケーションを再構築する必要がないため、アプリケーション全体をデプロイせずにクエリのバグを修正できます。あなたが持っている2番目のオプションは、起こるのを待っているメンテナンスの悪夢です。 1つまたは2つのクエリがあるとすごくうまく見えますが、そこに数十または数百のクエリがあると少し醜いように見えます。それは、C#だようにあなたのコードが見えますので、私はマイクロソフトエンタープライズライブラリをチェックアウトをお勧めし、

http://msdn.microsoft.com/en-us/library/ff632023.aspx

あなたはあなたが開発している.NETフレームワークのバージョンに応じて、異なるバージョンをダウンロードする必要があります。 (単にではなくよりも、データベースとを相互に作用して、私は、ユーティリティタイプのアプリケーションのためにこれを行っている独自のそれは)

0

あなたは絶対にストアドプロシージャとは対照的に、「インライン」SQLを持っている必要があります場合は、私が入れてお勧めしますあなたのSQLをembedded resource fileに変換してください。これにより、クエリをより簡単に維持することができます(ただし、変更するにはアプリを再コンパイルする必要があります)。

0

クエリが1行または2行より長い場合は、それらを独自の.sqlファイルに入れることを検討する必要があります。埋め込みリソースにファイルのビルドアクションを設定し、GetManifestResourceStream()を呼び出してアクセスします。そうすることで、構文の強調表示、検証、およびインテリセンス(データベースにVSを接続するとき)を使用して、sqlを適切な言語のステータスに昇格させます。言うまでもなく、これは保守を非常に容易にする。

このすべてが面倒であると思われる場合は、VS拡張子「QueryFirst」を取得してください。提供されたテンプレートを使用して.sqlファイルを作成すると、自動的にコンパイルのために配線されます。しかし、生成されたクラスを介してクエリにアクセスするだけなので気にしません。

Sqlは、文字列リテラルで細かく見えると私が考えることができる唯一のコンピュータ言語です。それはスキャンダルでなければならない。

関連する問題