0

いくつかのパラメータをとる必要な結果を引き出すための長くて複雑なクエリがあるとします。どれでもかまいませんが、例として:

SELECT
    q.PROD_ID, q.NAME, q.STANDARD_PROD, q.DESCRIPTION, q.PART_NUMBER,
    q.COMMENTS, q.DESCRIPTION_URL,
    PROD_CATEGORY.DESCRIPTION AS CATEGORY_DESCRIPTION,
    PROD_TYPES.DESCRIPTION AS PROD_TYPE
FROM
    (SELECT
        PROD.PROD_ID,
        PROD.PROD_TYPE_ID,
        PROD.NAME,
        PROD.STANDARD_PROD,
        PROD.PROD_CATEGORY_ID,
        PROD.DESCRIPTION,
        PROD.PART_NUMBER,
        PROD.COMMENTS,
        PROD.DESCRIPTION_URL
     FROM
        (SELECT
            PROD_ID,
            PROD_TYPE_ID
         FROM
            XREF_PRODSYS
         WHERE
            (PROD_TYPE_ID = (SELECT
                                PROD_TYPE_ID
                             FROM
                                PROD_TYPES
                             WHERE
                                (NAME LIKE @prod_type_name)))) AS p
     LEFT OUTER JOIN PROD ON p.PROD_ID = PROD.PROD_ID
     WHERE
        (PROD.NAME LIKE @prod_name)
        AND (PROD.HIDDEN = 0)) AS q
LEFT OUTER JOIN PROD_CATEGORY ON q.PROD_CATEGORY_ID = PROD_CATEGORY.PROD_CATEGORY_ID
LEFT OUTER JOIN PROD_TYPES ON q.PROD_TYPE_ID = PROD_TYPES.PROD_TYPE_ID

この特定のクエリは2つのパラメータを取り、おそらくGET/POSTを介して.NETWebアプリに渡されます。

WebアプリケーションページのC#ソースに配置するのではなく、このような長いクエリを保存するためのよりクリーンな方法はありますか?以下の「迅速で汚い」アプローチはうまく機能することを私は知っていますが、それはコードを大幅に拡張し、少し扱いに​​くくなります。例えば:

    //inside Page_Load...
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.Parameters.Add("@prod_type_name", SqlDbType.VarChar).Value = _type_name;
    cmd.Parameters.Add("@prod_name", SqlDbType.VarChar).Value = _prod_name;
    cmd.CommandText = @"
    SELECT     q.PROD_ID, q.NAME, q.STANDARD_PROD, q.DESCRIPTION, q.PART_NUMBER, q.COMMENTS, q.DESCRIPTION_URL, 
              PROD_CATEGORY.DESCRIPTION AS CATEGORY_DESCRIPTION, PROD_TYPES.DESCRIPTION AS PROD_TYPE
    FROM         (SELECT     PROD.PROD_ID, PROD.PROD_TYPE_ID, PROD.NAME, PROD.STANDARD_PROD, PROD.PROD_CATEGORY_ID, PROD.DESCRIPTION, 
                                      PROD.PART_NUMBER, PROD.COMMENTS, PROD.DESCRIPTION_URL
               FROM          (SELECT     PROD_ID, PROD_TYPE_ID
                                       FROM          XREF_PRODSYS
                                       WHERE      (PROD_TYPE_ID =
                                                                  (SELECT     PROD_TYPE_ID
                                                                    FROM          PROD_TYPES
                                                                    WHERE      (NAME LIKE @prod_type_name)))) AS p LEFT OUTER JOIN
                                      PROD ON p.PROD_ID = PROD.PROD_ID
               WHERE      (PROD.NAME LIKE @prod_name) AND (PROD.HIDDEN = 0)) AS q LEFT OUTER JOIN
              PROD_CATEGORY ON q.PROD_CATEGORY_ID = PROD_CATEGORY.PROD_CATEGORY_ID LEFT OUTER JOIN
              PROD_TYPES ON q.PROD_TYPE_ID = PROD_TYPES.PROD_TYPE_ID
              ";
              //... do stuff with cmd
4

5 に答える 5

6

これをすべてストアドプロシージャに入れてストアドプロシージャを呼び出し、パラメータを適切に渡してみませんか?

ストアドプロシージャを作成する方法

...
cmd.CommandText = "sprocname";
cmd.CommandType = CommandType.StoredProcedure
...
于 2012-07-02T17:06:30.077 に答える
2

ストアドプロシージャに入れます。または、SQLステートメントの文字列定数でいっぱいのファイル。

于 2012-07-02T17:06:58.263 に答える
2

これは、ストアドプロシージャが意味をなす場所かもしれません。それは間違いなくあなたのソースコードをクリーンアップするでしょう。

于 2012-07-02T17:08:08.040 に答える
1

別の注意:いくつかの考えで、そのcarpyクエリを次のように書き直すことができます:

SELECT PROD.PROD_ID, PROD.NAME, PROD.STANDARD_PROD, PROD.DESCRIPTION, 
       PROD.PART_NUMBER, PROD.COMMENTS, PROD.DESCRIPTION_URL, 
       PROD_CATEGORY.DESCRIPTION AS CATEGORY_DESCRIPTION, 
       PROD_TYPES.DESCRIPTION AS PROD_TYPE 
FROM  XREF_PRODSYS
JOIN  PROD_TYPES 
  ON PROD_TYPES.PROD_TYPE_ID = XREF_PRODSYS.PROD_TYPE_ID
LEFT OUTER JOIN PROD 
  ON p.PROD_ID = PROD.PROD_ID AND PROD.NAME LIKE @prod_name AND PROD.HIDDEN = 0
LEFT OUTER JOIN PROD_CATEGORY 
  ON q.PROD_CATEGORY_ID = PROD_CATEGORY.PROD_CATEGORY_ID 
WHERE  PROD_TYPES.NAME LIKE @prod_type_name

改善が見られるかもしれません。(同じ情報を取得するためのより良い方法があると確信していますが、これはDBがどのように設計されているかを推測/推測しなくても機能します。ただし、このクエリは最初のテーブルとしてXREF_PRODSYSではなくPRODから選択する必要があります。)

あなたのクエリはEntityFrameworkのスマックですよね?

于 2012-07-02T17:21:46.117 に答える
0

ストアドプロシージャは、Justinによってリストされている1つの方法です。

通常、WebアプリIや他の多くのアプリを構築するときは、データアクセス層を別のプロジェクトまたはクラスに分割します。私は通常5つの層を構築します:データベース<->(SQLがどこかに行く必要があります;ここにIMO、またはDB、または少なくとも別のクラスに行く必要があります)データアクセス層<->ビジネスオブジェクト層<->コードビハインド<-> HTML/Razor。これにより、コードがはるかに管理しやすくなり、同様に重要なことに再利用可能になります。

于 2012-07-02T17:27:15.457 に答える