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

C# 使用存储过程asp.net进行动态搜索,c#,asp.net,sql-server,stored-procedures,datatable,C#,Asp.net,Sql Server,Stored Procedures,Datatable,我在asp.net中使用存储过程实现动态搜索时遇到问题 我有一个考勤系统的数据表和数据库,我想搜索一个有主要控件的员工,比如他的ID和日期,设备类型等等 这是我的默认.aspx.cs代码 public partial class _Default : Page { static string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; protected void Pa

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

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" %>


生物网络时间电话

按时出勤

用户ID:

活动日期:

活动时间:


读者:

 



我的存储过程是:

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)
创建过程用户搜索
(
@EventUserId int=NULL,
@EventDateFrm nvarchar(10)=空,
@EventDateTo nvarchar(10)=空,
@Readerid int=NULL
)
作为
选择V_EventLogs.EventUserId、V_EventLogs.EventDate、V_EventLogs.EventTime、V_EventLogs.Eventtype、V_EventLogs.Readerid
从V_事件日志
哪里
(@EventUserId为NULL或EventUserId=@EventUserId)
及
(@EventDateFrm为NULL或Convert(varchar(10),EventDate,110)>=Convert(varchar(10),@EventDateFrm,110))
及

(@EventDateTo为NULL或Convert(varchar(10),EventDate,110)我建议您仅在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();

当然,最好是将所有内容都放在一个try-catch中,然后使用“using”…-)

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

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中相应的页面结果,并将其绑定回网格。一个简单的谷歌搜索可能会为您提供其他解决方案。但是,上面的更改应该可以按照您的需要工作。

您可以创建动态搜索SQL server存储过程

Create PROCEDURE CUSTOMER.GET_DynamicSearch ( -- Optional Filters for Dynamic Search @CustomerID INT = NULL, @CustomerName NVARCHAR(50) = NULL, @CustomerTitle NVARCHAR(50) = NULL, @locationId int = NULL, @ControlCardNumber bigint = NULL, @Formnumber int = NULL ) AS BEGIN SET NOCOUNT ON DECLARE @lCustomerID INT = NULL, @lCustomerName NVARCHAR(50) = NULL, @lCustomerTitle NVARCHAR(50) = NULL, @llocationId int = NULL, @lControlCardNumber bigint = NULL, @lFormnumber int = NULL SET @lCustomerID = @CustomerID SET @lCustomerName = LTRIM(RTRIM(@CustomerName)) SET @lCustomerTitle = LTRIM(RTRIM(@CustomerTitle)) SET @llocationId = LTRIM(RTRIM(@locationId)) SET @lControlCardNumber = @ControlCardNumber SET @lFormnumber = LTRIM(RTRIM(@Formnumber)) SELECT c.CustomerId, c.CustomerName, c.CustomerTitle, c.LocationId, c.ControlCardNumber, c.FormNumber FROM CUSTOMER.Customer c WHERE (@lCustomerID IS NULL OR CustomerId = @lCustomerID) AND (@lCustomerName IS NULL OR CustomerName LIKE '%' +@lCustomerName + '%') AND (@lCustomerTitle IS NULL OR CustomerTitle LIKE '%' + @lCustomerTitle + '%') AND (@llocationId IS NULL OR locationId = @llocationId ) AND (@lControlCardNumber IS NULL OR ControlCardNumber = @lControlCardNumber) AND (@lFormnumber IS NULL OR Formnumber = @lFormnumber) ORDER BY c.CustomerID asc END GO 创建过程CUSTOMER.GET\u DynamicSearch ( --用于动态搜索的可选筛选器 @CustomerID INT=NULL, @客户名称NVARCHAR(50)=空, @CustomerTitle NVARCHAR(50)=空, @locationId int=NULL, @ControlCardNumber bigint=NULL, @Formnumber int=NULL ) 作为 开始 不计较 声明 @LCCustomerId INT=NULL, @LCCustomerName NVARCHAR(50)=空, @LCCustomerTitle NVARCHAR(50)=空, @llocationId int=NULL, @lControlCardNumber bigint=NULL, @lFormnumber int=NULL 设置@lCustomerID=@CustomerID 设置@lCustomerName=LTRIM(RTRIM(@CustomerName)) 设置@LCCustomerTitle=LTRIM(RTRIM(@CustomerTitle)) 设置@llocationId=LTRIM(RTRIM(@locationId)) 设置@lControlCardNumber=@ControlCardNumber 设置@lFormnumber=LTRIM(RTRIM(@Formnumber)) 挑选 c、 客户ID, c、 客户名称, c、 客户信息, c、 LocationId, c、 控制卡号, c、 FormNumber 来自客户c 哪里 (@LCCustomerId为NULL或CustomerId=@LCCustomerId) 和(@lCustomerName为NULL或类似于“%”+@lCustomerName+“%”的CustomerName) 和(@lCustomerTitle为NULL或类似于“%”+@lCustomerTitle+“%”的CustomerTitle) 和(@llocationId为NULL或locationId=@llocationId) 和(@lControlCardNumber为空或ControlCardNumber=@lControlCardNumber) 和(@lFormnumber为NULL或Formnumber=@lFormnumber) c.CustomerID asc订购 结束 去 执行细节

EXEC CUSTOMER.GET_DynamicSearch -- 2000 records EXEC CUSTOMER.GET_DynamicSearch--2000条记录 --仅提供CustomerName参数时:

EXEC CUSTOMER.GET_DynamicSearch @CustomerName= 'Uttam' -- 1040 records EXEC CUSTOMER.GET_DynamicSearch@CustomerName='Uttam'--1040条记录
gridData()
方法返回数据后,为什么不在方法的外面声明Datatable并进行绑定?更改签名以返回页面中的Datatable,加载一个else并将那里的数据绑定到datagrid。。这应该是一个简单的解决办法。。当调用
Fill
方法时,您是否可以在调试时确认数据是否实际加载到datatable中?您的分页应该是以下
GridView1.CurrentPageIndex=e.NewPageIndex
然后像这样分配数据源和数据绑定
GridView1.datasource=sdt
//将datatable实例移到方法外部,使其成为公共的或静态的
GridView1.DataBind()您是否熟悉回发。。?但是在页面加载事件中有一个断点,您将看到哪里出了问题。。您需要一个
if(IsPostBack)else{}
您不需要检查==false,也不需要执行
if(!IsPostBack){}else{}
或执行
if(IsPostBack){}else{}
我尝试了您的代码,但没有执行相同的错误数据表没有任何数据,我已经在使用try catch,但没有例外您的搜索功能仅在btnSearch\u Click事件处理程序上调用。您是否尝试过使用相同的参数调试并直接运行SP?是的,我在Sql Server上尝试过SP,它可以正常工作,但当我调用时,它没有从SP获得任何搜索值,并且数据网格不显示。这也不起作用。数据网格不显示或显示任何搜索结果,但存储过程 EXEC CUSTOMER.GET_DynamicSearch @CustomerName= 'Uttam' -- 1040 records