使用存储过程asp.net进行动态搜索

本文关键字:动态 搜索 net 存储过程 asp | 更新日期: 2023-09-27 18:28:21

在asp.net中使用存储过程实现动态搜索时遇到问题我有一个考勤系统的数据表和数据库,我想搜索一个有主要控件的员工,比如他的ID和日期,设备类型。。。等这是我的Default.aspx代码

public partial class _Default : Page
{
    static string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            this.gridData();
            this.search();
        }
    }
    //--------------------------------------------------
    private void gridData()
    {
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT EventUserId, EventDate, EventTime, Eventtype, Readerid FROM V_EventLogs"))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    DataTable dt = new DataTable();
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    sda.Fill(dt);
                    GridView1.DataSource = dt;
                    GridView1.DataBind();
                }
            }
        }
    }
    private DataTable search()
    {
        DataTable sdt = new DataTable();
        SqlConnection con = new SqlConnection(constr);
        try
        {
            SqlCommand cmd = new SqlCommand("userSearch", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = 300;
            cmd.Parameters.AddWithValue("@EventUserId", TextBox1.Text);
            cmd.Parameters.AddWithValue("@EventDateFrm", ASPxDateEdit1.Text);
            cmd.Parameters.AddWithValue("@EventDateTo", ASPxDateEdit2.Text);
            cmd.Parameters.AddWithValue("@Readerid", txtReader.Text);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            // passs parameter to data adapter
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            sda.Fill(sdt);
        }
        catch (Exception ex)            {
            Response.Write(ex);
        }
        return sdt;
    }

   //---------------------------------------------------

    protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        this.gridData();
    }
    protected void btnSearch_Click(object sender, EventArgs e)
    {    
        GridView1.DataSource = search();
        GridView1.DataBind();
    }
}

}

这是我的Default.aspx页面:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<div class="jumbotron">
    <h1>BioWeb TimeTel</h1>
    <p class="lead">Time Attendance</p>
    <%--<p><a href="http://www.asp.net" class="btn btn-primary btn-lg">Learn more &raquo;</a></p>--%>
</div>
<div>
        User ID:
        &nbsp;<asp:TextBox ID="TextBox1" runat="server" CssClass="form-control"></asp:TextBox>
        &nbsp;
        <br />
        <br />
        Event Date:
        &nbsp;&nbsp;
        <br />
        <dx:ASPxDateEdit ID="ASPxDateEdit1" runat="server" DisplayFormatString="MM/dd/yyyy" EditFormatString="MM/dd/yyyy">
        </dx:ASPxDateEdit>
        <br />
        Event Time:
        <br />
        &nbsp;<dx:ASPxDateEdit ID="ASPxDateEdit2" runat="server" DisplayFormatString="MM/dd/yyyy" EditFormatString="MM/dd/yyyy">
        </dx:ASPxDateEdit>
        &nbsp;
        <br />
        <br />
        Reader:
        &nbsp;<asp:TextBox ID="txtReader" runat="server" CssClass="form-control" AutoCompleteType="Disabled"></asp:TextBox>
        &nbsp;
        <br />
        <br />
        &nbsp
        <br />
        <br />
        <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" CssClass="btn btn-primary btn-lg" OnLoad="Page_Load" />
        <br />
        <br />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" AllowPaging="true"
        OnPageIndexChanging="OnPageIndexChanging" PageSize="10" UseAccessibleHeader="True" CssClass="table table-hover">
        <Columns>
            <asp:BoundField DataField="EventUserId" HeaderText="User ID" />
            <asp:BoundField DataField="EventDate" HeaderText="Date IN" />
            <asp:BoundField DataField="EventTime" HeaderText="Time IN" />
            <asp:BoundField DataField="Eventtype" HeaderText="Type" />
            <asp:BoundField DataField="Readerid" HeaderText="Reader" />
        </Columns>
    </asp:GridView>     
    </div>

我的存储过程是:

CREATE procedure userSearch
(
@EventUserId int = NULL,
@EventDateFrm nvarchar(10) = NULL,
@EventDateTo nvarchar(10) = NULL,
@Readerid int = NULL
)
as
select V_EventLogs.EventUserId,V_EventLogs.EventDate,V_EventLogs.EventTime,V_EventLogs.Eventtype,V_EventLogs.Readerid 
from V_EventLogs 
where
(@EventUserId is NULL OR EventUserId = @EventUserId )
AND
(@EventDateFrm is NULL OR Convert(varchar(10),EventDate,110) >= Convert(varchar(10),@EventDateFrm,110))
AND 
(@EventDateTo is NULL OR Convert(varchar(10),EventDate,110)  <= Convert(varchar(10),@EventDateTo,110))
AND
(@Readerid is NULL OR Readerid = @Readerid)

现在,当我想搜索员工时,网格数据表仍然是空的,没有得到任何值,但当在SQL server上测试我的存储过程时,它运行良好-第二个问题是,当分页数据表时,动态搜索只对第一个页面有效。当我选择任何其他页面时,搜索实现都不起作用,数据表显示所有数据库值!!为什么?

使用存储过程asp.net进行动态搜索

答案就在您的问题中。您没有在PageIndexChanging中进行任何搜索。。。

protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    this.gridData();
}

上面的代码只是在gridData()方法检索所有记录时重新绑定整个数据,设置NewPageIndex只会将您移动到该页面。

试着写下面这样的东西:

protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        GridView1.DataSource = search();
    }

这不是一个完美的解决方案。应该使用在存储过程本身中实现的分页;此SP应将页面索引和每页记录数与其他搜索标准一起作为输入;您需要构建一个动态SQL来获取SP中相应的页面结果,并将其绑定回网格。一个简单的谷歌搜索可能会给你其他的解决方案。但是,上面的改变应该如你所愿。

我建议您只在Fill命令之后关闭连接,不要调用ExecuteNonQuery,就像这样:

    SqlCommand cmd = new SqlCommand("userSearch", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = 300;
    cmd.Parameters.AddWithValue("@EventUserId", TextBox1.Text);
    cmd.Parameters.AddWithValue("@EventDateFrm", ASPxDateEdit1.Text);
    cmd.Parameters.AddWithValue("@EventDateTo", ASPxDateEdit2.Text);
    cmd.Parameters.AddWithValue("@Readerid", txtReader.Text);
    // passs parameter to data adapter
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    con.Open();
    sda.Fill(sdt);
    con.Close();

如果您希望使用DataAdapter。否则,您可以直接检索数据:

    SqlCommand cmd = new SqlCommand("userSearch", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = 300;
    cmd.Parameters.AddWithValue("@EventUserId", TextBox1.Text);
    cmd.Parameters.AddWithValue("@EventDateFrm", ASPxDateEdit1.Text);
    cmd.Parameters.AddWithValue("@EventDateTo", ASPxDateEdit2.Text);
    cmd.Parameters.AddWithValue("@Readerid", txtReader.Text);
    con.Open();
    var reader = cmd.ExecuteReader();
    var dtbl = new DataTable();
    dtbl.Load(reader);
    con.Close();

当然,最好把所有的东西都放在一个尝试捕获中,并使用"使用"……:-)

您可以创建动态搜索SQL服务器存储过程

创建PROCEDURE CUSTOMER.GET_DynamicSearch(--用于动态搜索的可选筛选器@CustomerID INT=NULL,@客户名称NVARCHAR(50)=NULL,@CustomerTitle NVARCHAR(50)=NULL,@locationId int=NULL,@ControlCardNumber bigint=NULL,@表单号int=NULL)作为开始设置NOCOUNT声明@lCustomerID INT=空,@lCustomerName NVARCHAR(50)=空,@l客户标题NVARCHAR(50)=空,@allocationId int=NULL,@lControlCardNumber bigint=NULL,@lFormnumber int=NULLSET@lCustomerID=@客户IDSET@lCustomerName=LTRIM(RTRIM(@CustomerName))SET@lCustomerTitle=LTRIM(RTRIM(@CustomerTitle))SET@allocationId=LTRIM(RTRIM(@locationId))SET@lControlCardNumber=@ControlCardNumberSET@lFormnumber=LTRIM(RTRIM(@Formnumber))选择c.客户ID,c.客户名称,c.客户名称,c.LocationId,c.控制卡号,c.表格编号来自客户。客户c其中(@lCustomerID为空或CustomerId=@lCustomerID)AND(@lCustomerName为NULL或CustomerName LIKE"%"+@lCustomerName+"%")AND(@lCustomerTitle为NULL或CustomerTitle类似"%"+@lCustomerTitle+"%")AND(@llocationId为NULL或locationId=@llocationId)AND(@lControlCardNumber为空或ControlCardNumber=@lControlCardNumber)AND(@lFormnumber为NULL或Formnumber=@lFormnumber)按c.客户ID asc订购完去

执行详细信息

EXEC CUSTOMER.GET_DynamicSearch--2000条记录

--关于仅提供CustomerName参数:

EXEC CUSTOMER.GET_DynamicSearch@CustomerName='Uttam'-1040条记录