ASP.NET结合存储过程写的通用搜索分页

select.aspx

--------------------------------------------------------------------------------

<%@ Page Language="C#" %>

<%@ import Namespace="System.Data" %>

<%@ import Namespace="System.Data.SqlClient" %>

<script runat="server">

protected void Page_Load(Object sender, EventArgs e)

{

int intPageNo,intPageSize,intPageCount;

intPageSize = 25;

if (Request["CurrentPage"]==null)

{

intPageNo = 1;

}

else

{

intPageNo = Int32.Parse(Request["CurrentPage"]);

}

SqlConnection mySqlConnection = new SqlConnection("server=(local);Database=test;user );

SqlCommand mySqlCommand = new SqlCommand("up_GetTopicList", mySqlConnection);

mySqlCommand.CommandType = CommandType.StoredProcedure;

SqlParameter workParm;

//搜索表字段,以","号分隔

workParm = mySqlCommand.Parameters.Add("@a_TableList", SqlDbType.VarChar, 200);

mySqlCommand.Parameters["@a_TableList"].Value = "OFFERID,type,offertime";

//搜索表名

workParm = mySqlCommand.Parameters.Add("@a_TableName", SqlDbType.VarChar, 30);

mySqlCommand.Parameters["@a_TableName"].Value = "offer";

//搜索条件,如"select * from aa where a=1 and b=2 and c=3"则条件为"where a=1 and b=2 and c=3"

workParm = mySqlCommand.Parameters.Add("@a_SelectWhere", SqlDbType.VarChar, 500);

mySqlCommand.Parameters["@a_SelectWhere"].Value = "where type='idl'";

//表主键字段名,必须为INT类型

workParm = mySqlCommand.Parameters.Add("@a_SelectOrderId", SqlDbType.VarChar, 50);

mySqlCommand.Parameters["@a_SelectOrderId"].Value = "offerid";

//排序,可以使用多字段排序但主键字段必需在最前面

workParm = mySqlCommand.Parameters.Add("@a_SelectOrder", SqlDbType.VarChar, 50);

mySqlCommand.Parameters["@a_SelectOrder"].Value = "order by offerid desc";

//页号

workParm = mySqlCommand.Parameters.Add("@a_intPageNo", SqlDbType.Int);

mySqlCommand.Parameters["@a_intPageNo"].Value = intPageNo;

//每页显示数

workParm = mySqlCommand.Parameters.Add("@a_intPageSize", SqlDbType.Int);

mySqlCommand.Parameters["@a_intPageSize"].Value = intPageSize;

//总记录数(存储过程输出参数)

workParm = mySqlCommand.Parameters.Add("@RecordCount", SqlDbType.Int);

workParm.Direction = ParameterDirection.Output;

//当前页记录数(存储过程返回值)

workParm = mySqlCommand.Parameters.Add("RowCount", SqlDbType.Int);

workParm.Direction = ParameterDirection.ReturnValue;

mySqlConnection.Open();

Repeater.DataSource = mySqlCommand.ExecuteReader();

Repeater.DataBind();

mySqlConnection.Close();

Int32 RecordCount = (Int32)mySqlCommand.Parameters["@RecordCount"].Value;

Int32 RowCount = (Int32)mySqlCommand.Parameters["RowCount"].Value;

LabelRecord.Text = RecordCount.ToString();

LabelRow.Text = intPageNo.ToString();

intPageCount = RecordCount/intPageSize;

if ((RecordCount%intPageSize)>0)

intPageCount += 1;

LabelPage.Text = intPageCount.ToString();

if (intPageNo>1)

{

HLFistPage.NavigateUrl = "select.aspx?CurrentPage=1";

HLPrevPage.NavigateUrl = String.Concat("select.aspx?CurrentPage=","",intPageNo-1);

}

else

{

HLFistPage.NavigateUrl = "";

HLPrevPage.NavigateUrl = "";

//HLFistPage.Enabled = false;

//HLPrevPage.Enabled = false;

}

if (intPageNo<intPageCount)

{

HLNextPage.NavigateUrl = String.Concat("select.aspx?CurrentPage=","",intPageNo+1);

HLEndPage.NavigateUrl = String.Concat("select.aspx?CurrentPage=","",intPageCount);

}

else

{

HLNextPage.NavigateUrl = "";

HLEndPage.NavigateUrl = "";

//HLNextPage.Enabled=false;

//HLEndPage.Enabled=false;

}

}

</script>

<html>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<head>

<link href="/style.css" rel="stylesheet" />

<style type="text/css">

.high { font-family: "宋体"; font-size: 9pt; line-height: 140%}

.mid { font-size: 9pt; line-height: 12pt}

.small { font-size: 9pt; line-height: normal}

.TP10_5 {

font-size: 14px;

line-height: 140%;

}

</style>

<style type="text/css">A:link {

COLOR: #cc6666

}

</style>

</head>

<body>

<form runat="server">

<span class="high"> 第<font color="#CC0000"><asp:Label >

<HeaderTemplate>

<table width="583" cellspacing="0" cellpadding="0">

<tr>

<td bgcolor="#000000"><table width="100%" cellpadding="4" cellspacing="1" class="TP10_5">

<tr bgcolor="#999999">

<td align="center"> <strong><font color="#FFFFFF">订单号</font></strong></td>

<td align="center"> <strong><font color="#FFFFFF">服务项目</font></strong></td>

<td align="center"> <strong><font color="#FFFFFF">预订日期</font></strong></td>

<td align="center"> <strong><font color="#FFFFFF">操作人员</font></strong></td>

<td align="center"> <strong><font color="#FFFFFF">分配状态</font></strong></td>

<td> <div align="center"></div></td>

</tr>

</HeaderTemplate>

<ItemTemplate>

<tr align="center" bgcolor="#FFFFFF" class="small" onMouseOver='this.style.background="#CCCCCC"' onMouseOut='this.style.background="#FFFFFF"'>

<td><%# DataBinder.Eval(Container.DataItem, "offerid") %></td>

<td><%# DataBinder.Eval(Container.DataItem, "type") %></td>

<td><%# DataBinder.Eval(Container.DataItem, "offertime") %></td>

<td> </td>

<td> </td>

<td><a href="javascript:void(window.open('info.asp?offerid") %>','订单分配','height=600,width=1000'))">订单详情</a></td>

</tr>

</ItemTemplate>

<FooterTemplate>

</table></td>

</tr>

</table>

</FooterTemplate>

</asp:Repeater>

</form>

</body>

</html>

--------------------------------------------------------------------------------

up_GetTopicList.sql

--------------------------------------------------------------------------------

CREATE proc up_GetTopicList

@a_TableList Varchar(200),

@a_TableName Varchar(30),

@a_SelectWhere Varchar(500),

@a_SelectOrderId Varchar(20),

@a_SelectOrder Varchar(50),

@a_intPageNo int,

@a_intPageSize int,

@RecordCount int OUTPUT

as

/*定义局部变量*/

declare @intBeginID int

declare @intEndID int

declare @intRootRecordCount int

declare @intRowCount int

declare @TmpSelect NVarchar(600)

/*关闭计数*/

set nocount on

/*求总共根贴数*/

select @TmpSelect = 'set nocount on;select @SPintRootRecordCount = count(*) from '+@a_TableName+''+@a_SelectWhere

execute sp_executesql

@TmpSelect,

N'@SPintRootRecordCount int OUTPUT',

@SPintRootRecordCount=@intRootRecordCount OUTPUT

select @RecordCount = @intRootRecordCount

if (@intRootRecordCount = 0) --如果没有贴子,则返回零

return 0

/*判断页数是否正确*/

if (@a_intPageNo - 1) * @a_intPageSize > @intRootRecordCount

return (-1)

/*求开始rootID*/

set @intRowCount = (@a_intPageNo - 1) * @a_intPageSize + 1

/*限制条数*/

select @TmpSelect = 'set nocount on;set rowcount @SPintRowCount;select @SPintBeginID = '+@a_SelectOrderId+' from '+@a_TableName+''+@a_SelectWhere+''+@a_SelectOrder

execute sp_executesql

@TmpSelect,

N'@SPintRowCount int,@SPintBeginID int OUTPUT',

@SPintRowCount=@intRowCount,@SPintBeginID=@intBeginID OUTPUT

/*结束rootID*/

set @intRowCount = @a_intPageNo * @a_intPageSize

/*限制条数*/

select @TmpSelect = 'set nocount on;set rowcount @SPintRowCount;select @SPintEndID = '+@a_SelectOrderId+' from '+@a_TableName+''+@a_SelectWhere+''+@a_SelectOrder

execute sp_executesql

@TmpSelect,

N'@SPintRowCount int,@SPintEndID int OUTPUT',

@SPintRowCount=@intRowCount,@SPintEndID=@intEndID OUTPUT

if @a_SelectWhere='' or @a_SelectWhere IS NULL

select @TmpSelect = 'set nocount off;set rowcount 0;select '+@a_TableList+' from '+@a_TableName+' where '+@a_SelectOrderId+' between '

else

select @TmpSelect = 'set nocount off;set rowcount 0;select '+@a_TableList+' from '+@a_TableName+''+@a_SelectWhere+' and '+@a_SelectOrderId+' between '

if @intEndID > @intBeginID

select @TmpSelect = @TmpSelect+'@SPintBeginID and @SPintEndID'+' '+@a_SelectOrder

else

select @TmpSelect = @TmpSelect+'@SPintEndID and @SPintBeginID'+' '+@a_SelectOrder

execute sp_executesql

@TmpSelect,

N'@SPintEndID int,@SPintBeginID int',

@SPintEndID=@intEndID,@SPintBeginID=@intBeginID

return(@@rowcount)

--select @@rowcount

GO