0

ASP.NET は初めてです

クエリをセッション変数の条件と組み合わせようとしています。

基本的に、特定の入力をキャプチャし、以下のセッション セッションを構築します。そして、それが Response.Write によって機能することを知っています。

Session("QueryCondition") = " AND Name like '%Test%' AND CompLeteFlag = 1"

GridView1 に SelectCommand があります

SelectCommand="SELECT top 100 * FROM [EnhanceTracking] WHERE 1 = 1 order by ID DESC"

私がやりたいのは、上記のクエリを Session("QueryCondition") と組み合わせてレコードをフィルタリングすることです。古典的なASPの場合、次のように実行できます

SelectCommand="SELECT top 100 * FROM [EnhanceTracking] WHERE 1 = 1 " & Session("QueryCondition") & " order by ID DESC"

ただし、変数を SelectCommand と組み合わせることは許可されていないため、ASP.NET でこれを行う方法がわかりません。

何をすべきかアドバイスしてください。事前に感謝します。

4

1 に答える 1

0

作成したWebアプリケーションについても同様のことをしました。asp:SqlDatasourceのOnSelectingイベント(分離コードでselectコマンドを動的に構築する代わりにこれを使用することをお勧めします)を利用して、selectコマンドのパラメーターを動的に調整できます。

これがこれを行うための最適な方法であるかどうかはわかりませんが、機能します。

私のマークアップは次のようになりました(GridViewタグが簡略化されています):

<asp:SqlDataSource ID="SelectItemsDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:hubConnectionString %>" 
    ProviderName="<%$ ConnectionStrings:hubConnectionString.ProviderName %>" 

        SelectCommand="SELECT itemEntity.id, itemEntity.name, itemEntity.filename, itemEntity.type, itemEntity.added, userEntity.name FROM item AS itemEntity 
                        LEFT OUTER JOIN USER AS userEntity ON itemEntity.uploader = userEntity.id WHERE itemEntity.type like @type ORDER BY itemEntity.added DESC" 
        OnSelecting="onItemSelecting"> 
        <SelectParameters>
           <asp:Parameter Name="@type" Type="String" />
        </SelectParameters>       
</asp:SqlDataSource>

<asp:GridView ID="ItemGrid" runat="server" DataSourceID="SelectItemsDataSource"/> // Simplified

OnSelecting属性に注意してください。

次に、コードビハインドでOnSelectingイベントを処理できます。

protected void onItemSelecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    // Type value NOT given and parameter exists - Set wildcard
    if (Request.QueryString["type"] == null && e.Command.Parameters.Contains("@type"))
    {
        e.Command.Parameters["@type"].Value = "%";
        return;
    }
    if (Request.QueryString["type"] != null && e.Command.Parameters.Contains("@type"))
            e.Command.Parameters["@type"].Value = Request.QueryString["type"];   
    }

Command.ParametersメソッドはSQLインジェクションで安全だと思います。そうでない場合は、誰かが私を修正してください。

于 2012-12-12T08:06:46.237 に答える