9

私は多くのインラインSQLクエリを使用するasp.netWebサイトで作業しています...そしてインラインクエリをその場で作成するのが最善かどうか疑問に思っています:

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;    

    }
}

ありがとうございました!

4

8 に答える 8

8

私は1日に多くのADO.NETクエリを使用し、常に最初の方法を使用しました。2番目の方法は興味深いアイデアですが、それを使用するコード内の別の場所にいる場合は、これらのクエリを編集するのが面倒な場合があります。また、コード内の特定の場所でクエリが何を行っているかを確認するのが難しくなります。例:

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

何が起こっているかを開発者に伝えます。

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

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

あなたが物事を変えるかもしれないいくつかの場所でこのクエリを書いているなら

于 2012-10-05T16:11:09.393 に答える
6

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

ただし、説明した2番目の方法を使用している場合は、代わりにストアドプロシージャの使用を開始しない理由をお聞きします。

于 2012-10-05T16:08:57.337 に答える
4

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

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

開発している.NETFrameworkのバージョンによっては、異なるバージョンをダウンロードする必要がある場合があります。

于 2012-10-05T16:22:45.907 に答える
1

ストアドプロシージャではなく「インライン」SQLが絶対に必要な場合(データベースを所有するのではなく、データベースと対話するだけのユーティリティタイプのアプリケーションに対してこれを実行しました)、SQLを埋め込みリソースファイルに配置することをお勧めします。これにより、クエリの保守が容易になります(ただし、変更を加えるにはアプリを再コンパイルする必要があります)。

于 2012-10-05T16:27:36.867 に答える
0

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

于 2012-10-05T16:21:18.547 に答える
0

いくつかの場所で繰り返されない限り、クエリを「インライン」にしても問題ないと思います。それが発生し始めたら、Queryクラスの作成を開始することをお勧めします。

于 2012-10-05T16:08:30.623 に答える
0

どちらの場合も、最終的にStringはに渡すビルド/フェッチを行いますCommandText。したがって、そのような違いはありません。あなたの場合に考慮する必要があるのは、あなたがコードをどのように維持するか、または他の人があなたのコードをどのように理解するかということだけです。

于 2012-10-05T16:11:28.487 に答える
0

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

これがすべて面倒に思える場合は、私のVS拡張機能であるQueryFirstを入手してください。提供されたテンプレートを使用して.sqlファイルを作成すると、コンパイル用に自動的に接続されます。ただし、生成されたクラスを介してクエリにアクセスするだけなので、気にする必要はありません。

SQLは、文字列リテラルに切り刻まれているのを見るのに受け入れられると私が考えることができる唯一のコンピューター言語です。それはスキャンダルであるべきです。

于 2016-05-30T12:48:19.017 に答える