【问题标题】:Restructured SQL Query but it does not display elements重组 SQL 查询,但不显示元素
【发布时间】: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.TexttxtTypeFilter.Text的例子,还有..FunderType字段的架构是什么?您可能有尾随空格
  • 没有通配符的Like子句将不起作用。
  • 我添加了更多定义。 Funder 和 Type 都是字符串 / nvarchar(255)。您如何建议我将查询更改为不使用通配符?

标签: c# asp.net webforms


【解决方案1】:

你有一个很好的设置。但是,每次您希望添加可选参数时,都应该将文本框测试“配对”。

因此,通过此设置,您可以拥有 1 或 5 个可选过滤器。

因为你想要一个喜欢,请看下面的代码:

所以,我建议这样做:

        SqlDataSource sdsProjects = new SqlDataSource();

        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 ([Type] LIKE '%' + @Type + '%') ";
            sdsProjects.SelectParameters.Add("@Type",DbType.String, txtTypeFilter.Text);
        }

        if (!string.IsNullOrEmpty(txtFunderFilter.Text))
        {
            queryWhere += " AND ([Funder] LIKE '%' + @Funder + '%') ";
            sdsProjects.SelectParameters.Add("@Funder",DbType.String, txtFunderFilter.Text);
        }

        sdsProjects.SelectCommand = queryDefault + queryBase + queryWhere + queryOrder;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2015-11-10
    • 2018-01-19
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多