关于存储过程实现分页小问题 100分等你拿快

z1393055105 2009-03-23 09:17:31
存储过程实现分页的代码我是在论坛里问个老大下载的,然后代码我贴出来。
以下是两个存储过程:

SQL code
CREATE PROC sp_PageCount
@tbname sysname, --要分页显示的表名
@Where nvarchar(1000)='', --查询条件
@Count int OUTPUT --总页数
as
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @Count=COUNT(*)'
+N' FROM '+@tbname
+N' where '+@Where
EXEC sp_executesql @sql,N'@Count int OUTPUT',@Count OUTPUT
GO


CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序
@Where nvarchar(1000)='' --查询条件
AS
declare @topN int
set @topN= (@PageCurrent-1)*@PageSize
exec (N'select top '+@PageSize+N''+@FieldShow+N' from '+@tbname+N' where ID not in(select top '+@topN+N' ID from '+@tbname+N' where '+ @Where+N' '+@FieldOrder+ N')'+N' and '+ @Where+N' '+@FieldOrder)
GO





调用方法:

C# code
public SqlConnection GetConn()
{
string ConnString=ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;//web.config取值
Conn=new SqlConnection(ConnString);
return Conn;
}

public DataSet PageView(string tmpTab, int tmpPagenumber, int tmpPagesize, string tmpField, string tmpOrder, string tmpWhere)
{
SqlConnection myConnection = GetConn();
SqlDataAdapter mySda = new SqlDataAdapter();
SqlCommand myCommand = new SqlCommand("sp_PageView", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;

myCommand.Parameters.Add("@tbname", SqlDbType.VarChar, 50).Value = tmpTab;
myCommand.Parameters.Add("@PageCurrent", SqlDbType.Int).Value = tmpPagenumber;
myCommand.Parameters.Add("@PageSize", SqlDbType.Int).Value = tmpPagesize;
myCommand.Parameters.Add("@FieldShow", SqlDbType.VarChar, 1000).Value = tmpField;
myCommand.Parameters.Add("@FieldOrder", SqlDbType.VarChar, 1000).Value = tmpOrder;
myCommand.Parameters.Add("@Where", SqlDbType.VarChar, 1000).Value = tmpWhere;

DataSet myDs = new DataSet();
myConnection.Open();
mySda.SelectCommand = myCommand;
mySda.Fill(myDs, "tmp");
myConnection.Close();
return myDs;
}

public int PageCount(string tmpTab, string tmpWhere)
{
SqlConnection myConnection = GetConn();
SqlCommand myCommand = new SqlCommand("sp_PageCount", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;

myCommand.Parameters.Add("@tbname", SqlDbType.VarChar, 50).Value = tmpTab;
myCommand.Parameters.Add("@Where", SqlDbType.VarChar, 1000).Value = tmpWhere;
myCommand.Parameters.Add("@Count", SqlDbType.Int).Direction = ParameterDirection.Output;

myConnection.Open();
myCommand.ExecuteNonQuery();
int returnID = (int)myCommand.Parameters["@Count"].Value;
myCommand.Parameters.Clear();
myConnection.Close();

return returnID;
}

调用:
string where = "";
AspNetPager1.RecordCount = PageCount("Subject", where);
DataTable dt = PageView("Subject", AspNetPager1.CurrentPageIndex, AspNetPager1.PageSize, "*", "Order by SubjectCode", where).Tables[0];
Repeater1.DataSource = dt.DefaultView;
Repeater1.DataBind();

AspNetPager1.CustomInfoHTML = "记录总数:" + AspNetPager1.RecordCount;
AspNetPager1.CustomInfoHTML += " 总页数:" + AspNetPager1.PageCount;
AspNetPager1.CustomInfoHTML += " 当前页:" + AspNetPager1.CurrentPageIndex;


他这个方法是要把条件语句写在where里,,那问题来了

我想实现的效果是。我在一个页面里用Repeater1绑定了我在一个类别里写的存储过程

比方:
在page_load里
DataTable da=new newsmanager().selectall()
Repeater1.DataSource = da;
Repeater1.DataBind();
绑定以后 我想实现的效果是:我按照我这个类的方法 进行分页,而不是他那个where进行分页。。好像说的怪怪的,这个也说不好。大概意思吧。就是分页我这个page_load里面的这个方法。这个要怎么分页。

80分我在线等,如果回答的很好,我明天继续追加分。 绝对要代码不要几句话就没了,调用部分的也要有。我高分求



...全文
270 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
z1393055105 2009-03-24
  • 打赏
  • 举报
回复
等ING啊啊啊
the_pain 2009-03-24
  • 打赏
  • 举报
回复
up
z1393055105 2009-03-24
  • 打赏
  • 举报
回复
等啊等
z1393055105 2009-03-24
  • 打赏
  • 举报
回复
老大你在看下哈 ,有了我继续给你追分。。我去搞点分先。快没了
z1393055105 2009-03-24
  • 打赏
  • 举报
回复
老大你在看下哈 ,有了我继续给你追分。。我去搞点分先。快没了
z1393055105 2009-03-24
  • 打赏
  • 举报
回复
楼上的老大哈哈 又是你,我的意思是,你的那个where 语句,我想换成1个存储过程

我自己写的个存储过程那个是select * from 表名

我想分页这个存储过程里的数据 ,并不是分页那个where制定的条件。

还是你厉害哈哈 ,还有个朋友代码发了那么多,我看不懂。。分也给你,难得发这么多

楼上的老大 能按我这个方法在给我写个代码么,,我看我还有分么,有我在追哈
liujiayu10 2009-03-24
  • 打赏
  • 举报
回复
呵呵,是你啊!

这是个通用的存储过程分页,所以,没有太多的个性化了,where里一般只写条件

楼主的意思,是不是先用存储过程分页,比如从1000条里过滤出100条,装进一个Datatable中,然后再在绑定控件前再分一次页,是这样吗?

      /**//// <summary>
/// 对DataTable进行分页,起始页为1
/// </summary>
/// <param name="dt"></param>
/// <param name="PageIndex"></param>
/// <param name="PageSize"></param>
/// <returns></returns>
public static DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
return dt;
DataTable newdt = dt.Copy();
newdt.Clear();

int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;

if (rowbegin >= dt.Rows.Count)
return newdt;

if (rowend > dt.Rows.Count)
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - 1; i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
}

return newdt;
}
hbpolo 2009-03-24
  • 打赏
  • 举报
回复
Mark ~
Jcomet 2009-03-24
  • 打赏
  • 举报
回复
这么长怎么看啊,我建议楼主直接使用aspnetpager控件算了,省事 省时
zzxap 2009-03-24
  • 打赏
  • 举报
回复
[CODE=C#]
下面的代码 就是放在页面里的了

#region 执行代码
/// <summary>
/// 执行代码
/// </summary>
public void DateList()
{
wd = Request.QueryString["wd"];

if (Request.QueryString["Page"] == null)
{
curPageno = 1;
}
else
{
curPageno = int.Parse(Request.QueryString["Page"].ToString());
}

if (this.curPageno < 1)
{
this.curPageno = 1;
}
if (Request.QueryString["wd"] != null)
{
searchWhere = "title like '%" + wd + "%'";
}

this.Repeater1.DataSource = Database.Database.SearchRecord("表名", "字段,列出所需要的字段", searchWhere, "Id", "Id desc", 10, curPageno, ref recordCount, ref pageCount);
this.Repeater1.DataBind();
if (this.pageCount > 0)
{
if (this.curPageno > this.pageCount)
{
this.curPageno = this.pageCount;
}
}
this.BuildPagers(); //调用分页代码

}
#endregion

可以DateList() 调用了呵呵

接下来 在第4标题写出分页的代码。
下面是分页代码了

#region 分页代码
/// <summary>
/// 分页代码
/// </summary>
public void BuildPagers()
{
string PageUrl = Request.FilePath;
string strUrl = string.Format("&wd={0}", Request.QueryString["wd"]);
StringBuilder OutPut = new StringBuilder();

if (curPageno > 1)
{
OutPut.Insert(0, string.Format("  <a href='{0}?Page=1{2}'>最前页</a>  <a href='{0}?Page={1}{2}'>上一页</a>  ", PageUrl, (curPageno - 1), strUrl));
}
if (curPageno < pageCount)
{
OutPut.Append("  <a href='");
OutPut.Append(PageUrl);
OutPut.Append("?Page=");
OutPut.Append(curPageno + 1);
OutPut.Append(strUrl);
OutPut.Append("'>下一页</a>  <a href='");
OutPut.Append(PageUrl);
OutPut.Append("?Page=");
OutPut.Append(pageCount);
OutPut.Append(strUrl);
OutPut.Append("'>最后页</a>");
}
this.LabPageList.Text = OutPut.ToString();
this.LabPager.Text = string.Format("记录数:<font color='red'>{0}</font>  页码:<font color='red'>{1}/{2}</font> ", recordCount, curPageno,pageCount);
}
#endregion

还有最后的放在第5次了
最后就是 前台页面的显示了。

我用的是Repeater控件

<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate><table width="70%"></HeaderTemplate>
<ItemTemplate>
<tr>
<td><span style="font-size:14px;font-weight:bold;"><%#"DataBinder.Eval(Container.DataItem, "标题都与数据的字段一样")%></span>
<br><%#DataBinder.Eval(Container.DataItem, "内容都与数据的字段一样")%>

</td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>

</div>
<br>
<asp:Label ID="LabPager" runat="server"></asp:Label>
<asp:Label ID="LabPageList" runat="server"></asp:Label>

好了大功告成了,有空慢慢研究吧,嘎嘎
[/CODE]
zzxap 2009-03-24
  • 打赏
  • 举报
回复
[CODE=C#]
接下来是写 asp.net 调用存储过程的类了。


#region 存储过程
/// <summary>
/// 存储过程之查询
/// </summary>
/// <param name="strTable">表名</param>
/// <param name="strFileds">显示列名</param>
/// <param name="searchText">查询条件,不带where</param>
/// <param name="strOrderFiled">排序</param>
/// <param name="strOrderValue">排序规则</param>
/// <param name="pageSize">每页输出的记录数</param>
/// <param name="curPageno">当前页</param>
/// <param name="recordCount">总条数</param>
/// <param name="pageCount">总页数</param>
/// <returns></returns>
public static DataSet SearchRecord(string strTable, string strFileds, string searchText, string strOrderFiled, string strOrderValue, int pageSize, int curPageno, ref int recordCount, ref int pageCount)
{
string strSqlSelect = "P_PAGINATION";
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand();

cmd.Parameters.Add("@TableName", SqlDbType.NVarChar, 200).Value = strTable;
cmd.Parameters["@TableName"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@FieldList", SqlDbType.NVarChar, 2000).Value = strFileds;
cmd.Parameters["@FieldList"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@PrimaryKey", SqlDbType.NVarChar, 100).Value = strOrderFiled;
cmd.Parameters["@PrimaryKey"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@Where", SqlDbType.NVarChar, 1000).Value = searchText;
cmd.Parameters["@Where"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@Order", SqlDbType.NVarChar, 1000).Value = strOrderValue;
cmd.Parameters["@Order"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@SortType", SqlDbType.Int, 4).Value = 2;
cmd.Parameters["@SortType"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@RecorderCount", SqlDbType.Int, 4).Value = 0;
cmd.Parameters["@RecorderCount"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@PageSize", SqlDbType.Int, 4).Value = pageSize;
cmd.Parameters["@PageSize"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@PageIndex", SqlDbType.Int, 4).Value = curPageno;
cmd.Parameters["@PageIndex"].Direction = ParameterDirection.Input;

cmd.Parameters.Add("@TotalCount", SqlDbType.Int, 4).Value = 0;
cmd.Parameters["@TotalCount"].Direction = ParameterDirection.Output;

cmd.Parameters.Add("@TotalPageCount", SqlDbType.Int, 4).Value = 0;
cmd.Parameters["@TotalPageCount"].Direction = ParameterDirection.Output;


using (SqlConnection cn = new SqlConnection(Common.Common.ConnectString)) //进行sql链接
{
cn.Open();
SqlDataAdapter dtApt = new SqlDataAdapter();
dtApt.SelectCommand = cmd;
dtApt.SelectCommand.Connection = cn;
dtApt.SelectCommand.CommandType = CommandType.StoredProcedure;
dtApt.SelectCommand.CommandText = strSqlSelect;
dtApt.Fill(ds, Common.Common.sql_TableName); //输出显示结果
cn.Close();
cn.Dispose();
recordCount = (int)dtApt.SelectCommand.Parameters["@TotalCount"].Value;
pageCount = (int)dtApt.SelectCommand.Parameters["@TotalPageCount"].Value;
return ds;
}
}

#endregion

也是直接可以用的,需要注意的是 Common.Common.ConnectString 和Common.Common.sql_TableName

这两个都是数据连接的类,一个是连接数据的 一个是表名,可以换成自己的,就OK了

接下来换装第三标题去了。
[/CODE]
zzxap 2009-03-24
  • 打赏
  • 举报
回复
[code=SQL]
asp.net 调用分页存储过程例子
2008-11-28 16:02
最近在狂研究asp.net,调用分页存储过程成功,现在这个方法写出来吧。

先看看存储过程,如果自己不会写的,可以去网上当吧,这样的教程多的是,下面我也是当的,不过大家复制就可以用了。

先去sql 新建存储过程,把下面的代码粘贴进去 确定。

CREATE PROC P_PAGINATION
/*
no_mIss 分页存储过程 2007.2.20 QQ:34813284
适用于单一主键或存在唯一值列的表或视图
*/
@TableName VARCHAR(200), --表名
@FieldList VARCHAR(2000), --显示列名
@PrimaryKey VARCHAR(100), --单一主键或唯一值键
@Where VARCHAR(1000), --查询条件 不含'where'字符
@Order VARCHAR(1000), --排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效
@SortType INT, --排序规则 1:正序asc 2:倒序desc 3:多列排序
@RecorderCount INT, --记录总数 0:会返回总记录
@PageSize INT, --每页输出的记录数
@PageIndex INT, --当前页数
@TotalCount INT OUTPUT, --返回记录总数
@TotalPageCount INT OUTPUT --返回总页数
AS
SET NOCOUNT ON
IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''
OR ISNULL(@PrimaryKey,'') = ''
OR @SortType < 1 OR @SortType >3
OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
BEGIN
RETURN
END

DECLARE @new_where1 VARCHAR(1000)
DECLARE @new_where2 VARCHAR(1000)
DECLARE @new_order VARCHAR(1000)
DECLARE @Sql VARCHAR(8000)
DECLARE @SqlCount NVARCHAR(4000)

IF ISNULL(@where,'') = ''
BEGIN
SET @new_where1 = ' '
SET @new_where2 = ' WHERE '
END
ELSE
BEGIN
SET @new_where1 = ' WHERE ' + @where
SET @new_where2 = ' WHERE ' + @where + ' AND '
END

IF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2
BEGIN
IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'
IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'
END
ELSE
BEGIN
SET @new_order = ' ORDER BY ' + @Order
END

SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
+ CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1

IF @RecorderCount = 0
BEGIN
EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
@TotalCount OUTPUT,@TotalPageCount OUTPUT
END

ELSE
BEGIN
SELECT @TotalCount = @RecorderCount
END

IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
BEGIN
SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)
END
IF @PageIndex = 0
BEGIN
SET @PageIndex = 1
END
IF @PageIndex = 1
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where1 + @new_order
END
ELSE
BEGIN
IF @SortType = 1
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' > '
+ '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
+ ' FROM ' + @TableName
+ @new_where1 + @new_order +' ) AS TMP) '+ @new_order
END
IF @SortType = 2
BEGIN
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' < '
+ '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
+' FROM '+ @TableName
+ @new_where1 + @new_order + ') AS TMP) '+ @new_order
END
IF @SortType = 3
BEGIN
IF CHARINDEX(',',@Order) = 0 BEGIN RETURN END
SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
+ @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '
+ STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
+ ' FROM ' + @TableName + @new_where1 + @new_order + ')'
+ @new_order
END
END
EXEC(@Sql)
GO



[/CODE]
andrewsway 2009-03-24
  • 打赏
  • 举报
回复
我带了几个查询条件,你去了就直接可以用

ALTER procedure [dbo].[pagerprco]
(@startIndex int,
@endIndex int,
@docount int output,
@title varchar(50),
@desc varchar(MAX))
as


select @docount = count(1) from MCO_GROUP WHERE GP_NAME like '%' + @title + '%' and GP_DESCRIPTION like '%' + @desc + '%'
begin
with temptbl as (
SELECT ROW_NUMBER()
OVER (ORDER BY GP_ID desc)AS Row, O.GP_ID,O.GP_NAME,O.GP_DESCRIPTION from MCO_GROUP O
WHERE GP_NAME like '%' + @title + '%' and GP_DESCRIPTION like '%' + @desc + '%' )
SELECT GP_ID,GP_NAME,GP_DESCRIPTION FROM temptbl where Row between @startIndex and @endIndex
end
keystudio 2009-03-24
  • 打赏
  • 举报
回复
tmpWhere = "1=1";
benbirdar 2009-03-24
  • 打赏
  • 举报
回复
mark
帮等
z1393055105 2009-03-24
  • 打赏
  • 举报
回复
诶没有办法实现我说的效果么
z1393055105 2009-03-23
  • 打赏
  • 举报
回复
没发的他会提示错误不能为空必须要有条件,我就这里郁闷诶。这个分页是我唯一能看懂,研究透彻的,,
叶子 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 z1393055105 的帖子:]
我按照我这个类的方法 进行分页,而不是他那个where进行分页
[/Quote]
把where条件这个参数设为空不行吗?
z1393055105 2009-03-23
  • 打赏
  • 举报
回复
我就想让我那个存储过程它里面的是sql是 select * from 表名
就是吧表的内容都取出来,

这儿如何分页
wuyq11 2009-03-23
  • 打赏
  • 举报
回复
http://www.cnblogs.com/ly5201314/archive/2009/03/02/1400277.html
加载更多回复(1)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧