将分页存储过程绑定到GRIDVIEW????

xq1981 2010-07-29 02:36:52
我想用gridview来显示数据,但是分页想用存储过程,两者如何结合???
存储过程如下:

/*--邹建 2003.09(引用请保留此信息)--*/
CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT --总页数
AS
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以

给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
...全文
269 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
米娜Rose 2010-07-29
  • 打赏
  • 举报
回复
楼主调用的时候直接放响应的参数即可。
米娜Rose 2010-07-29
  • 打赏
  • 举报
回复

#region 分页

/// <summary>
/// 页面索引
/// </summary>
public int pageindex
{
get { return Convert.ToInt32(ViewState["Pageindex"]); }
set { ViewState["Pageindex"] = value; }
}

/// <summary>
/// 每页条数
/// </summary>
public int pagesize
{
get { return Convert.ToInt32(ViewState["Pagesize"]); }
set { ViewState["Pagesize"] = value; }
}

/// <summary>
/// 条数
/// </summary>
public int pagecount
{
get { return Convert.ToInt32(ViewState["Pagecount"]); }
set { ViewState["Pagecount"] = value; }
}

/// <summary>
/// 页数
/// </summary>
public int totalpage
{
get {
if (pagecount % pagesize == 0)
{
return pagecount / pagesize;
}
else {
return pagecount / pagesize + 1;
}
}
}

#endregion
beita258 2010-07-29
  • 打赏
  • 举报
回复
分页控件一般只需要知道
1.数据总数count
2.页面size
3.当前页数page

第一次加载分页控件时,传递 count ,size ,当前第一页
后面每次传递页号
even0220 2010-07-29
  • 打赏
  • 举报
回复
有分页控件,还要分页存储过程?
xq1981 2010-07-29
  • 打赏
  • 举报
回复

public void BindView(int pagesize,int current,SqlDataReader reader,ref int rcount,ref int pcount)
{
string strconn = "server=(local);uid=sa;pwd=Aa12345678;database=TEST";
SqlConnection cn = new SqlConnection(strconn);
cn.Open();
SqlCommand cm = new SqlCommand("PageNavtion",cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add("@PageSize",SqlDbType.Int);
cm.Parameters.Add("@CurrentPage", SqlDbType.Int);
cm.Parameters.Add("@RecordCount", SqlDbType.Int);
cm.Parameters.Add("@PageCount", SqlDbType.Int);
cm.Parameters["@PageSize"].Value = pagesize;
cm.Parameters["@CurrentPage"].Value = current;
cm.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
cm.Parameters["@PageCount"].Direction = ParameterDirection.Output;
reader=cm.ExecuteReader();
rcount = (int)cm.Parameters["@RecordCount"].Value;
pcount = (int)cm.Parameters["@PageCount"].Value;
cn.Close();
}

非常感谢11楼:我的现在函数写好了,就是关于如何调用:比如我初始化后调用它:
BindView(10,1,?,?,?);
这几个问号如何传值??问题核心就在这里??????
jack15850798154 2010-07-29
  • 打赏
  • 举报
回复
调用存储过程参数用的是SqlParameter param=new SqlParameter("@tbname",值);
cmd.parameter.add(param);

这样就可以了实现调用存储过程的参数;

至于OUTPUT 你看我以前写的一个例子看看对你有帮助吗?
(1)关于存储过程返回值问题(output,ruturn)
output存储过程:

alter proc usp_update
@count int output
as
set @count=(select count(*) from stu)



return存储过程:
alter proc usp_update
as
declare @count int
set @count=(select count(*) from stu)
return @count


.net代码(output):
SqlConnection con = new SqlConnection ("server=95F188CF1A24424;uid=jinzhiyuan;pwd=jinzhiyuan;database=student");
con.Open();
SqlCommand cmd = new SqlCommand("usp_update",con);
cmd.Parameters.Add("@count", SqlDbType.Int);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters["@count"].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();

int j=(int)cmd.Parameters["@count"].Value;
Response.Write("我是刚刚才执行的值:"+j);
con.Close();


.net代码(return)
SqlConnection con = new SqlConnection("server=95F188CF1A24424;uid=jinzhiyuan;pwd=jinzhiyuan;database=student");
con.Open();
SqlCommand cmd = new SqlCommand("usp_update",con);
cmd.Parameters.Add("@count", SqlDbType.Int);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters["@count"].Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();

int j=(int)cmd.Parameters["@count"].Value;
Response.Write("我是刚刚才执行的值:"+j);
con.Close();



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jack15850798154/archive/2009/10/29/4742747.aspx
xq1981 2010-07-29
  • 打赏
  • 举报
回复
CSDN上面怎么都是一些菜鸟啊,你们回答问题的时候,是不是从来不看问题,只知道粘帖一些没用的东西放到上面!我的问题很简单,就是在.net中如何调用存储过程里的参数,也许你们会说到网上搜,但网上搜的都是垃圾,换句话说,如果在百度能很快找到答案,那CSDN用来干鸟的!!!
zxcv6195602 2010-07-29
  • 打赏
  • 举报
回复
悲剧啊 既然你知道是自动分页 你还七七八八的
wuyq11 2010-07-29
  • 打赏
  • 举报
回复
看看aspnetpager分页控件
shhzy704 2010-07-29
  • 打赏
  • 举报
回复
分页控件 写个执行存储过程的方法 把参数传进去 帮定下就可以了
jack15850798154 2010-07-29
  • 打赏
  • 举报
回复
建议用aspnetpager控件。具体用法如:http://blog.csdn.net/jack15850798154/archive/2010/04/02/5444913.aspx你参考一下,当中有的地方需要修改的,不足的地方还请指正。
t20100504t 2010-07-29
  • 打赏
  • 举报
回复
再加几个参数

ALTER Procedure E_Course_Search]
@Keyword VarChar(64), --关键字
@UnitID int, --机构ID
@CourseID uniqueidentifier, --课程ID

/************排序设置***********/
@SortExpression VarChar(128) ,
@SortDirection VarChar(16) = 'Desc',
/***********分页设置************/
@PageCurr int = 1, --当前页码【如果小于零则为1】
@PageSize int = 60, --分页大小【如果小于零则为10】
@RecordCount int = 0 OutPut --总记录条数
AS
Declare @QueryString VarChar(Max)
Select @Keyword = Replace(@Keyword,'''','''''')
Select @QueryString = 'Select E_Course.[CourseID] , E_Course.[UnitID] , E_Course.[TypeID] , E_CourseType.TypeName , E_Course.[CourseName] , E_Course.[BeginDate] , E_Course.[EndDate] , E_Course.[ClassHour] , E_Course.[ClassAddress] , E_Course.[ChargeStandard] , E_Course.[Favourable] , E_Course.[IsHotspot] , E_Course.[IsCommend] , E_Course.[Clicks] , E_Course.[RefreshDate] , E_Course.[Classes] From E_Course inner join E_CourseType on E_CourseType.TypeID = E_Course.TypeID'
If Len(@Keyword) > 0
Begin
Select @QueryString = @QueryString + ' Where ([CourseName] Like ''%' + @Keyword + '%'' Or [BeginDate] Like ''%' + @Keyword + '%'' Or [EndDate] Like ''%' + @Keyword + '%'' Or [ClassAddress] Like ''%' + @Keyword + '%'' Or [RefreshDate] Like ''%' + @Keyword + '%'' Or [Classes] Like ''%' + @Keyword + '%'' Or E_CourseType.TypeName Like ''%' + @Keyword + '%'' Or E_Course.CourseID Like ''%' + @Keyword + '%'' )'
End
Else
Begin
Select @QueryString = @QueryString + ' Where 1 = 1 '
End
If @CourseID <> '00000000-0000-0000-0000-000000000000'
Select @QueryString = @QueryString + ' and CourseID ='''+Convert(varchar(256),@CourseID)+''''
Declare @OrderString VarChar(256), @FieldShow VarChar(1024)
Select @OrderString = ' ' + @SortExpression + ' ' + @SortDirection
Select @FieldShow = '[CourseID] , [UnitID] , [TypeID] , [CourseName] ,[TypeName], [BeginDate] , [EndDate] , [ClassHour] , [ClassAddress] , [ChargeStandard] , [Favourable] , [IsHotspot] , [IsCommend] , [Clicks] , [RefreshDate] , [Classes]'
If @UnitID > 0
Begin
Select @QueryString = @QueryString + ' And E_Course.UnitID = ''' + Convert(VarChar(10),@UnitID) + ''''
End
print @QueryString
exec Common_OrderUpend_Pagination @PageCurr = @PageCurr, @PageSize = @PageSize, @QueryString = @QueryString, @OrderString = @OrderString, @FieldShow = @FieldShow, @RecordCount = @RecordCount OutPut
Return @@ROWCOUNT
aluogang 2010-07-29
  • 打赏
  • 举报
回复
http://www.webdiyer.com/Controls/AspNetPager
看这里面例子怎么调用存储过程的
justin18 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 myhope88 的回复:]
这个应该自定义分页吧
[/Quote]自定义分页怎么写才算是好的方法呢?
myhope88 2010-07-29
  • 打赏
  • 举报
回复
这个应该自定义分页吧

62,046

社区成员

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

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

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

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