0

我是 ASP.NET 的新手

我正在尝试将查询与会话变量中的条件结合起来。

基本上,我捕获某些输入并在下面构建一个 Session 会话。我知道它通过 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"

但是,我不知道如何在 ASP.NET 中执行此操作,因为它不允许将变量与 SelectCommand 组合。

请告知该怎么做。提前致谢。

4

1 回答 1

0

我为自己制作的 Web 应用程序做了类似的事情。您可以利用 asp:SqlDatasource 的 OnSelecting 事件(我建议使用它而不是在代码隐藏中动态构建选择命令)来动态调整选择命令的参数。

我不确定这是否是这样做的最佳方式,但它确实有效。

我的标记看起来像这样(简化的 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 回答