繁体   English   中英

服务器控件作为SqlDataSource的参数来过滤结果

[英]Server Control as a parameter to SqlDataSource to filter results

问题

我正在尝试使用文本框txtSearch来过滤SqlDataSource结果。

我的查询:

SELECT 
    [id], [username], [name] 
FROM 
    [dbo].[users] 
WHERE 
    @filter IS NULL OR 
    LEN(@filter) = 0 OR 
    [name] LIKE ('%'+@filter+'%')

ASPX标记:

<div>
    <asp:TextBox ID="txtSearch" runat="server"></asp:TextBox>
    <asp:Button ID="btnSearch" runat="server" Text="Search" CausesValidation="False" OnClick="btnSearch_Click" />
</div>
<asp:SqlDataSource ID="SQLDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" 
     SelectCommand="SELECT [id], [username], [name] FROM [dbo].[users] WHERE @filter IS NULL OR LEN(@filter) = 0 OR [name] LIKE ('%'+@filter+'%')">
    <SelectParameters>
        <asp:ControlParameter ControlID="txtSearch" DefaultValue="" 
             Name="filter" Type="String" PropertyName="Text" />
    </SelectParameters>
</asp:SqlDataSource>

C#代码背后:

protected void btnSearch_Click(object sender, EventArgs e)
{
    GridView1.DataBind();
}

[dbo].[users]

id        name        username
----      ----        --------
  0       Jack        jhenry
  1       Jim         jcallaway
  2       Phillip     pmcarthur

我只是得到一个空网格,然后尝试将默认值设置为" " (单个空格),并将@filter IS NULL修改为@filter = '' 这给了我整个网格预期的效果,但是当我在文本框中输入一个值并点击Search ,什么也没发生。 如何以最少的努力使筛选器连接到SqlDataSource

肮脏的修复:

搜索空格" "而不是NULL可以,但是我已将ConvertEmptyStringToNull = True设置ConvertEmptyStringToNull = True

SELECT 
    [id], [username], [name] 
FROM 
    [dbo].[users] 
WHERE 
    @filter = ' ' OR 
    LEN(@filter) = 0 OR 
    [name] LIKE ('%'+@filter+'%')

我宁愿使用IS NULL使其干净,有可能吗?

您可以将Type="String"添加到ControlParameter并尝试以下查询吗?

SELECT [id], [username], [name]
FROM [dbo].[users]
WHERE LTRIM(RTRIM(@filter)) = '' 
   OR [name] LIKE '%'+ LTRIM(RTRIM(@filter)) +'%'

<SelectParameters>
   <asp:ControlParameter ControlID="txtSearch" 
           DefaultValue="" 
           Name="filter" 
           Type="String"
           PropertyName="Text" />
</SelectParameters>

更新时间

您需要重新绑定数据源而不是网格。

protected void btnSearch_Click(object sender, EventArgs e)
{
    SQLDataSource1.DataBind();
}

存储过程:

如果要验证逻辑,最好使用存储过程。

例如:

CREATE PROCEDURE GetUsers
    @Filter NVARCHAR(100) = NULL
AS
BEGIN
    DECLARE @SearchFilter BIT
    SET @SearchFilter = 1

    IF (@Filter IS NULL OR RTRIM(LTRIM(@Filter)) = N'')
        SET @SearchFilter = 0   

    SET @Filter = ISNULL(@Filter, '')
    SET @Filter = '%' + RTRIM(LTRIM(@Filter)) + '%'          

    SELECT [id], [username], [name]
    FROM [dbo].[users] WITH (NOLOCK)
    WHERE @SearchFilter = 0
       OR [name] LIKE @Filter
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM