![](/img/trans.png)
[英]Better way to add a parameter with null value to sqldatasource control
[英]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.