2016-11-15 8 views
0

私はかなり些細な作業のように見えるものを達成しなければなりませんが、予想以上に混乱していることが判明しました。ここにシナリオがあります:個別のSQL Serverデータベースクエリの結果セットをGridViewにロードする方法を教えてください。

私はSQL Serverデータベースからデータを取得しており、それをWebページ(かなり普通のシナリオ)に表示していますが、GridViewです。しかし、データベース上で実行されるクエリを決定するフィルタがいくつかありますが、最終的にはGridViewに表示されるデータが明らかに決定されます。私はこれらのフィルタを効率的に組み込むのに少し問題があります。現在、私はこれら3つのサブルーチンを持っています:LoadPendingRequests()LoadApprovedRequests()、およびLoadDeniedRequests()です。ご想像のとおり、私はCheckboxListを使用して、ユーザーが「保留中」、「承認済」、または「拒否」を選択できるようにします。選択された項目に応じて、対応するサブルーチンが呼び出され、GridViewに対応するデータ。この部分は動作します。

ユーザーは、保留、拒否、および承認された要求の任意の組み合わせを同時に読み込むことができます。これは私が困っているところです。ここでCheckboxListためSelectedIndexChangedイベントハンドラは次のとおりです。ここで

Protected Sub CheckboxList1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles CheckboxList1.SelectedIndexChanged 

     If CheckboxList1.SelectedIndex < 0 Then 
      CheckboxList1.SelectedIndex = 0 
     End If 


     If CheckboxList1.Items(0).Selected = True Then 'pending checkbox 
      LoadPendingRequests() 
     End If 
     If CheckboxList1.Items(1).Selected = True Then 'approved checkbox 
      LoadApprovedRequests() 
     End If 
     If CheckboxList1.Items(2).Selected = True Then 'denied checkbox 
      LoadDeniedRequests() 
     End If 
    End Sub 

は(ちょうど「どこで」句でフィルタ単語を置き換え、それらはすべて同じです)リクエストをロードサブルーチンの例です。

この設定では、ユーザがCheckboxListのボックスをクリックすると同時に、保留中、承認済み、拒否されたリクエストをロードする方法を教えてください。私は、必要に応じてこのプロセスを完全に変更することができます。

+0

これにアプローチする最も単純な方法は、WHERE句がチェックボックスに応じてオンザフライで構築されるクエリを1つだけ持つことです。 – peterG

+0

@peterG返事をありがとう。私はこのやり方も考えていました。誰かが別のアプローチのアイデアを持っているかどうかを見たいのですが、私はこのようにしてしまうかもしれません。 – ic3man7019

+0

より良いオプションは、ステータスをパラメータとして受け取るストアドプロシージャを作成することです。 –

答えて

1

このような種類のストアドプロシージャがどのように見えるかは次のとおりです。

create procedure Requests_GetByStatus 
(
    @Status varchar(10) 
) as 
    set nocount on; 

    select * 
    from dbo.reqTable 
    where Status = @Status 

ステータスをすべての行にテキストとして保存しないようにしてください。私は代わりに、テキスト値とint(可能性のあるID)を保持し、その値をあなたのRequestテーブルに格納するRequestStatusテーブルを持っています。もちろん、実際にはselect *を使用しないでください。実際に必要な列を指定する必要があります。

--EDIT--

これは三つのパラメータを渡すと、単一のクエリ内の任意のグループ内のデータを得ることができる1つの方法です。私はwhere述語を大幅に拡張して、何が起こっているかを簡単に見ることができます。

create procedure Requests_GetByStatus 
(
    @Pending bit = null 
    , @Approved bit = null 
    , @Denied bit = null 
) as 
    set nocount on; 

    select * 
    from dbo.reqTable 
    where 
    (
     (
      Status = 'Pending' 
      AND 
      @Pending = 1 
     ) 
    ) 
    OR 
    (
     (
      Status = 'Approved' 
      AND 
      @Approved = 1 
     ) 
    ) 
    OR 
    (
     (
      Status = 'Denied' 
      AND 
      @Denied = 1 
     ) 
    ) 
+0

私はこのアプローチが好きです。提案していただきありがとうございます。私は今それを試しています。好奇心のために、現状のアプローチではなく、別のテーブルにステータスを格納したいのはなぜですか?私は知ることに興味がある。私は本当にDBの男ではない。 – ic3man7019

+2

さて、企業はもはやステータスを「拒否」にしたくないと判断したとしましょう。代わりに、彼らはそれを「拒否」と名づけたい。すべての単一の行に説明を格納する場合、すべての単一の行を更新する必要があります。別のテーブルの場合は、ルックアップテーブルのその1行を更新します。テキストを何度も何度も保存することは、よく標準化されていません。あなたがそのテーブルに挿入している3つの場所があり、それらがすべて同じものを綴る必要がある場合を考えてみましょう。それから間違った綴りが見つかりました。 –

+0

ああ、そうです。それは理にかなっている。このアプローチは、どのようにして異なるステータスの要求を同時にロードするのに役立ちますか?私は何かを欠いていると確信しています。 – ic3man7019

関連する問題