简单通用分页存储过程: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 id=sa;password=");
   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 id="LabelRow" runat="server"/></font>页 | 共有<asp:Label id="LabelPage" runat="server"/>页
   | <asp:Label id="LabelRecord" runat="server"/>条信息 |
   <asp:HyperLink id="HLFistPage" Text="首页" runat="server"/>
   | <asp:HyperLink id="HLPrevPage" Text="上一页" runat="server"/>
   | <asp:HyperLink id="HLNextPage" Text="下一页" runat="server"/>
   | <asp:HyperLink id="HLEndPage" Text="尾页" runat="server"/></span><br>
  
   <asp:Repeater id=Repeater runat="server">
  
   <HeaderTemplate>
  
   <table width="583" border="0" cellspacing="0" cellpadding="0">
   <tr>
   <td bgcolor="#000000"><table width="100%" border="0" 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?id=<%# DataBinder.Eval(Container.DataItem, "offerid") %>','订单分配','height=600,width=1000'))">订单详情</a></td>
   </tr>
  
   </ItemTemplate>
  
   <FooterTemplate>
  
   </table></td>
   </tr>
   </table>
  
   </FooterTemplate>
  
   </asp:Repeater>
  
   </form>
  </body>
  </html>
  
  ------------------------------------------------ 
  up_GetTopicList.sql 

Code
  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 

 
  

posted @ 2008-11-27 02:45  jay-c  阅读(281)  评论(1)    收藏  举报