4

非常に単純なアプリケーションでSqlDataSourceを使用しています。ユーザーがTextBoxを介してSDSのselectコマンドにいくつかの検索パラメーターを設定できるようにしています。パラメーターごとに1つのTextBoxがあります(txtFirstName、txtLastNameなどを考えてください)。ボタンクリックイベントハンドラーを使用して、デフォルトですべてのレコードを返すSqlDataSourceのSelectCommandプロパティを設定することを計画しています(ここでの目的のために)。このselectコマンドを改良して、ユーザーがいずれかのTextBoxに検索条件を入力したかどうかに応じて、1つ以上のWHERE句を追加したいと思います。

はっきりしない場合の例:

デフォルトでは、SqlDataSourceのSelectCommandプロパティは次のようになります。

SELECT * FROM MyTable

ユーザーがtxtFirstNameに「Bob」と入力した場合、SelectCommandプロパティを次のようにします。

SELECT * FROM MyTable WHERE [FirstName]='Bob'

ユーザーがtxtLastNameに「Jones」と入力した場合、SelectCommandプロパティを次のようにします。

SELECT * FROM MyTable WHERE [FirstName]='Bob' AND [LastName]='Jones'

私の質問:
空のTextBoxをテストしたり、WHERE句を手動で作成したりせずに、これらのWHERE句を動的に作成する方法はありますか?

私の小さなアプリケーションには3つのパラメーターしかないので、これを無理やり押し込むのは苦痛ではありませんが、これを行うもっと簡単な方法があるかどうかに加えて、将来さらにパラメーターを追加する必要がある可能性があるのではないかと思いました。さらに、ワイルドカード検索を追加したい場合があります。

4

4 に答える 4

4

SqlDataSource コントロールを使用していて、パラメーター値がページ コントロールから取得されている場合は、ControlParameters を指定して、パラメーターを短縮した静的 where 句を使用できます。これは、いくつかのコードをすばやく実行するためのチケットにすぎない可能性があります。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:AdventureworksConnectionString %>"
    SelectCommand=" SELECT FirstName, LastName, Age
                    FROM Contacts 
                    WHERE (FirstName=@FirstName or @FirstName = '')
                    AND (LastName = @LastName or @LastName = '' 
                    AND (Age = @Age or @Age = 0" >
        <SelectParameters>
            <asp:ControlParameter Name="FirstName" ControlID="TBFirstName" Type="String" />
            <asp:ControlParameter Name="LastName" ControlID="TBLastName" Type="String" />
            <asp:ControlParameter Name="Age" ControlID="TBAge" Type="Int16" />
        </SelectParameters>
    </asp:SqlDataSource>
于 2012-04-17T19:41:30.067 に答える
2

あなたは設定ConvertEmptyStringToNull="false"して行うことができます:

SELECT * 
FROM MyTable 
WHERE [FirstName] = CASE @firstname WHEN '' THEN [FirstName] END AND 
    [LastName] = CASE @lastname WHEN '' THEN [LastName] END 

または、ConvertEmptyStringToNull = "true"を設定して、次の操作を行うことができます。

SELECT * 
FROM MyTable 
WHERE [FirstName] = ISNULL(@firstname, [FirstName]) AND 
    [LastName] = ISNULL(@lastname,[LastName])

いずれの場合も、ユーザーがテキストボックスを空白のままにすると、CASEorISNULLステートメントによってwhereステートメントの各部分がそれ自体と比較されるためTRUE、where句のその部分がまったく存在しない場合と同じレコードが返され、生成されます。これは、クエリとパラメータを静的に維持し、ロジックをSQL側にプッシュする優れたシンプルなソリューションです。

ただし、単に言うのに比べて、(小さな)パフォーマンスの低下があります"SELECT * FROM MyTable"。それらCASEISNULL操作は無料ではありません;)それが懸念される場合、Bryanmacのソリューションは完全に受け入れられるものです。

于 2012-03-27T15:00:52.477 に答える
2

あなたが言ったように、where句のフィールドを常にANDしているので、そのクエリを作成するのはそれほど難しくありません.

その場合は、文字列をフォーマットしないでください。SqlParameters を使用して SQL インジェクションを回避します: http://en.wikipedia.org/wiki/SQL_injection

したがって、WHERE から始めて、値を持つテキスト ボックスごとに [(fieldName)] = @(fieldname) を追加し、その sql パラメータをバインドします。

参照: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

Linq to SQL またはエンティティ フレームワークを使用する場合は、次の述語ビルダーを参照してください: http://www.albahari.com/nutshell/predicatebuilder.aspx

于 2012-02-09T00:23:48.133 に答える
0

この例CancelSelectOnNullParameter=falseに示すように使用できます

于 2012-02-09T00:30:54.237 に答える