Серверный элемент управления как параметр SqlDataSource для фильтрации результатов

Проблема

Я пытаюсь использовать текстовое поле txtSearchдля фильтрации результатов из a 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с наименьшими усилиями?

Dirty fix:

Поиск места " "вместо NULLработ, но я установил ConvertEmptyStringToNull = True

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

Я бы предпочел использоватьIS NULL, чтобы сделать его чистым, это возможно?

1 ответ

  1. Не могли бы вы добавить 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>
    

    Обновлено:

    Вместо Grid необходимо выполнить повторную привязку источника данных.

    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