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