0

我有一个带有 sqldatasource 等的 gridview。对于网格,我还有一个搜索文本框。如果用户需要过滤记录,我想使用带有参数的 sql 过程动态调整 SqlDataSource 的 SELECT 语句,可以从文本框中获取值。我喜欢分页、排序等所有自动功能,所以我不想只绑定旧方式。

有什么线索吗?

谢谢,

 <form id="form1" runat="server">
    <div>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
            SelectCommand="SelectCategorie" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter ControlID="TextBox1" Name="CategorieName" 
                    PropertyName="Text" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
            SelectCommand="SELECT [ProductName], [ProductID] FROM [Alphabetical list of products]">
        </asp:SqlDataSource>
        <br />
        <br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button3" runat="server" Text="Button" />
        <br />
        <br />
        <asp:DropDownList ID="DropDownList1" runat="server" 
            DataSourceID="SqlDataSource3" DataTextField="ProductName" 
            DataValueField="ProductName">
        </asp:DropDownList>
        <br />
        <br />
                <asp:Button ID="Button2" runat="server" Text="Change the datasource" />
        <br />
        <br />
                <asp:GridView ID="GridView1" runat="server" 
                    DataKeyNames="ProductID" DataSourceID="SqlDataSource1">
                    <Columns>
                        <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
                            InsertVisible="False" ReadOnly="True" SortExpression="ProductID" 
                            DataFormatString="[Yassine {0}]" />
                        <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
                            SortExpression="ProductName" />
                        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" 
                            SortExpression="SupplierID" />
                        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" 
                            SortExpression="CategoryID" />
                        <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" 
                            SortExpression="CategoryName" />
                        <asp:BoundField DataField="Description" HeaderText="Description" 
                            SortExpression="Description" />
                        <asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" 
                            SortExpression="QuantityPerUnit" />
                        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
                            SortExpression="UnitPrice" />
                        <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" 
                            SortExpression="UnitsInStock" />
                        <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" 
                            SortExpression="UnitsOnOrder" />
                        <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" 
                            SortExpression="ReorderLevel" />
                        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" 
                            SortExpression="Discontinued" />
                    </Columns>
                </asp:GridView>
        <br />
        <br />

    </div>
    </form>

和幕后的代码:

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        SqlDataSource1.SelectCommand = "SelectCategorieParDescription"
        SqlDataSource1.SelectParameters.Add("@ProductName", DropDownList1.DataValueField)
    End Sub
End Class

这是我得到的错误:

过程或函数 SelectCategorieParDescription 指定的参数过多

4

2 回答 2

1

我们对您想要做的事情使用类似的方法。困难的方法如下(您可以在此处查看有关此的文章:

  1. 为您的搜索语法创建语法
  2. 为该语法创建解析器
  3. 与解析器一起创建一个解释器,将您的搜索语法转换为 SQL(WHERE 部分)
  4. 创建一个存储过程,可以使用这个 whereSql 字符串并与完整的查询连接并调用 EXEC(@sqlQuery)

但是,所有这些可能需要您一段时间,另一种选择是将您的搜索功能限制为单个字符串。例子:

  1. 假设您的查询可以搜索 2 列:名称、socsecNumber
  2. 每当您读取字符串 john 时,您会将其转换为: name like '%john%' or (convert socsecNumber to string) like '%john%'
  3. 由您决定是否始终使用 % ,或者仅当用户的输入类似于:joh*
  4. 接收 where 查询的存储过程有点像这样:

    ALTER PROCEDURE [dbo].[usp_SearchForObjectsForDashboard]
        @searchTerm as varchar(250)
    BEGIN
        ...
        SET @sql = 'SELECT ...
            ...
            WHERE someConditionOfYourOwn = whatever
             AND ' + @searchTerm
    
        EXEC(@sql) 
    END
    

希望能帮助到你

于 2012-05-08T22:45:29.407 回答
0

我会尽量详细说明。为您的问题提供编码解决方案有点超出范围。我将提供一些关于如何处理这个问题的想法。希望其他人也能为此添加一些有价值的观点。

搜索可以通过多种方式实现。这完全取决于您的要求和搜索的效率。根据您的问题,我相信您正在尝试实现的是进行搜索和几个过滤选项

例如说你想搜索员工(并说你想按名字/姓氏/部门/经理搜索)

首先你可以有(除了 GridView 和 SqlDataSource)

1)搜索框的文本框。

2) 按选项搜索(4 个 RadioButtons 或带有firstname, lastname, department,的 DropDownList manager

3)一个按钮

4) 带有两个参数 ( searchText, searchBy)的存储过程

在您的存储过程中,根据您的SearchBy类型,您可以通过以下方式构建您的选择搜索查询searchText

伪代码

if (searchBy == firstname)
{
    set @sql = select ...... where firstName = searchText
}
else if (searchBy == lastname)
{
    set @sql = select ...... where lastName = searchText
}
else if (searchBy == department)
{
    set @sql = select ...... where department = searchText
}
else if (searchBy == manager)
{
    set @sql = select ...... where manager = searchText
}

exec(@sql)

在您的 button_click 中,您将从 DropDownList 或 RadioButtonsearchText的 TextBox中更改 sqlDataSource Select Parameters searchBy

这又是极简主义。您可以根据需要扩展它。例如

1)like在选择查询中使用子句来获取相似匹配而不是完全匹配(在 UI 中,您可以为用户提供在精确、相似匹配之间进行选择的选项)

2)您可以为用户提供在多个列中搜索的选项

等等(选项是无穷无尽的;同样取决于您的要求)

于 2012-05-09T00:17:19.350 回答