【发布时间】:2021-06-19 09:30:34
【问题描述】:
我有一个下拉列表 ddlProjecsFilter,我用我的数据库中所有项目的名称填充。
在页面加载时,我会显示这个下拉列表,当人们选择一个名称时,他们会获得有关该项目名称的所有信息。但是,我有两个基于字符输入的额外过滤器(资助者、类型)。
在编写这样的查询时,下拉列表中没有任何元素,但其他两个过滤器仍然有效。
protected void nameFilter()
{
string queryDefault = "SELECT NULL AS [Value], 'All' AS [Text], '0' AS [OrderNo] UNION ALL ";
string queryBase = "SELECT [NameId] AS [Value], [Type] AS [Text], '1' AS [OrderNo] FROM [tblProjects] ";
string queryWhere = " WHERE NameId IS NOT NULL ";
string queryOrder = " ORDER BY [OrderNo], [Text]";
if (!string.IsNullOrEmpty(txtTypeFilter.Text))
{
queryWhere +=" AND [Funder] LIKE @Funder";
queryWhere += " AND [Type] LIKE @Type";
}
sdsProjects.SelectCommand = queryDefault + queryBase + queryWhere + queryOrder;
sdsProjects.SelectParameters.Add("@Funder", txtFunderFilter.Text);
sdsProjects.SelectParameters.Add("@Type", txtTypeFilter.Text);
ddlProjectsFilter.DataBind();
}
如果我这样做,一切都会按预期进行。但是,这不是最佳做法。
if (!string.IsNullOrEmpty(txtTypeFilter.Text))
{
queryWhere += string.Format(" AND [Funder] LIKE'%{0}%'", txtFunderFilter.Text);
queryWhere += string.Format(" AND [Type] LIKE'%{0}%'", txtTypeFilter.Text);
}
谁能指出第一个sn-p的问题?
定义:
<td>
<asp:DropDownList runat="server" DataSourceID="sdsProjects" ID="ddlProjectsFilter"
AutoPostBack="true" DataTextField="Text" DataValueField="Value"
CssClass="form-control local-control" OnSelectedIndexChanged="ddlProjectsFilter_SelectedIndexChanged" AppendDataBoundItems="true">
</asp:DropDownList><asp:SqlDataSource ID="sdsProjectsFilter" runat="server" ConnectionString="<%$ ConnectionStrings:DatabaseLive %>"></asp:SqlDataSource>
</td>
<td></td>
<td>
<asp:TextBox runat="server" ID="txtTypeFilter" AutoPostBack="true" OnTextChanged="txtTypeFilter_TextChanged"
CssClass="form-control local-control TypeFilter"></asp:TextBox></td>
<td></td>
<td>
<asp:TextBox runat="server" ID="txtFunderFilter" AutoPostBack="true" OnTextChanged="txtFunderFilter_TextChanged"
CssClass="form-control local-control FunderFilter"></asp:TextBox></td>...
【问题讨论】:
-
hmm.. 它们不等价.. 如果第二个查询是
LIKE '{0}'(没有通配符),它们会是。所以第一个查询的问题可能是它需要一个通配符。我不确定.Text或参数值是否包含该通配符 -
我的想法是不要使用 %s。在这种情况下,需要对第一个代码进行哪些更改以使其与第二个 sn-p 等效?
-
提供
txtFunderFilter.Text和txtTypeFilter.Text的例子,还有..Funder和Type字段的架构是什么?您可能有尾随空格 -
没有通配符的Like子句将不起作用。
-
我添加了更多定义。 Funder 和 Type 都是字符串 / nvarchar(255)。您如何建议我将查询更改为不使用通配符?