小弟在SQL Server中写了一个分页的存储过程,如下:CREATE PROCEDURE PageNavtion
(
@PageSize int,--页大小
@CurrentPage int,--当前页
@RecordCount int output,--记录总数
@PageCount int output--分页数
)
ASif @CurrentPage <= 1--当前页为第一页
begin
set @CurrentPage = 0
end
else--当前页为N页
begin
set @CurrentPage = @CurrentPage - 1
enddeclare @ExeSQL varchar(1000) --执行的分页SQL语句
set @ExeSQL = 'select top'+Str(@PageSize)+' * from authors where au_id not in (select top'+str(@CurrentPage*@PageSize)+' au_id from authors order by au_id) order by au_id'
execute (@ExeSQL)set @RecordCount = (select count(*) from authors) --输出记录总数--输出页总数
if @RecordCount%@PageSize = 0
begin
set @PageCount = @RecordCount/@PageSize
end
else
begin
set @PageCount = @RecordCount/@PageSize + 1
end
GO调用存储过程的代码如下:public class Database
{
private SqlConnection con; //打开连接
public void Open()
{
con = new SqlConnection(ConfigurationSettings.AppSettings["ConStr"]);
con.Open();
} public void Close()
{
con = null;
} public void RunProc(int size,int current,out SqlDataReader reader,ref int Rcount,ref int Pcount)
{
this.Open(); SqlCommand cmd = new SqlCommand("PageNavtion",con);
cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));
cmd.Parameters[0].Value = size; cmd.Parameters.Add(new SqlParameter("@CurrentPage",SqlDbType.Int));
cmd.Parameters[1].Value = current; cmd.Parameters.Add(new SqlParameter("@RecordCount",SqlDbType.Int));
cmd.Parameters[2].Direction = ParameterDirection.Output; cmd.Parameters.Add(new SqlParameter("@PageCount",SqlDbType.Int));
cmd.Parameters[3].Direction = ParameterDirection.Output; reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
Rcount = (int)cmd.Parameters[2].Value;
Pcount = (int)cmd.Parameters[3].Value; cmd = null;
this.Close();
}
}调用的代码略...
运行是报错:未将对象引用设置到对象的实例。
出错代码为:Rcount = (int)cmd.Parameters[2].Value;请大侠们帮帮小弟~~~~~~~~~
(
@PageSize int,--页大小
@CurrentPage int,--当前页
@RecordCount int output,--记录总数
@PageCount int output--分页数
)
ASif @CurrentPage <= 1--当前页为第一页
begin
set @CurrentPage = 0
end
else--当前页为N页
begin
set @CurrentPage = @CurrentPage - 1
enddeclare @ExeSQL varchar(1000) --执行的分页SQL语句
set @ExeSQL = 'select top'+Str(@PageSize)+' * from authors where au_id not in (select top'+str(@CurrentPage*@PageSize)+' au_id from authors order by au_id) order by au_id'
execute (@ExeSQL)set @RecordCount = (select count(*) from authors) --输出记录总数--输出页总数
if @RecordCount%@PageSize = 0
begin
set @PageCount = @RecordCount/@PageSize
end
else
begin
set @PageCount = @RecordCount/@PageSize + 1
end
GO调用存储过程的代码如下:public class Database
{
private SqlConnection con; //打开连接
public void Open()
{
con = new SqlConnection(ConfigurationSettings.AppSettings["ConStr"]);
con.Open();
} public void Close()
{
con = null;
} public void RunProc(int size,int current,out SqlDataReader reader,ref int Rcount,ref int Pcount)
{
this.Open(); SqlCommand cmd = new SqlCommand("PageNavtion",con);
cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));
cmd.Parameters[0].Value = size; cmd.Parameters.Add(new SqlParameter("@CurrentPage",SqlDbType.Int));
cmd.Parameters[1].Value = current; cmd.Parameters.Add(new SqlParameter("@RecordCount",SqlDbType.Int));
cmd.Parameters[2].Direction = ParameterDirection.Output; cmd.Parameters.Add(new SqlParameter("@PageCount",SqlDbType.Int));
cmd.Parameters[3].Direction = ParameterDirection.Output; reader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
Rcount = (int)cmd.Parameters[2].Value;
Pcount = (int)cmd.Parameters[3].Value; cmd = null;
this.Close();
}
}调用的代码略...
运行是报错:未将对象引用设置到对象的实例。
出错代码为:Rcount = (int)cmd.Parameters[2].Value;请大侠们帮帮小弟~~~~~~~~~
解决方案 »
- 为什么我的VS2008在进行ASP.NET web应用程序开发时没有视图栏呢??没法进行“设计视图”,“源代码”的切换
- asp:Repeater 合并单元格
- 使用Repeater,如何在Datasource为空时输出固定内容
- 初学VS2005,我的项目完全用window.open(),包括主页面也是用window.open(),但是每次打开主页都会被拦截,今天突然看到showmodaldialog,傻了
- 关于页面继承的问题
- 【SOS】怎么得到 DataList 控件中绑定的值
- 为什么精华区没有文章呢???????????很是不解!------请斑竹帮忙
- vs.net中关于后台编码的错误信息
- 请教各位高手修改时出现问题,,在线等!
- 我想弄个公用连接对象怎么办?在线等待,急啊!
- 奇怪的OleDB错误,希望有高手帮忙解答一下
- 江雨,思归!关于treeview,我怎么还是不懂?
Pcount = (int)cmd.Parameters["@PageCount"].Value;
@vc_select_table_list varchar(100),@vc_condition varchar(100),@page_size int,@current_page int,@total1 int output
/*
(
@vc_order_column_name :表要排序列的列名,只能按一列排序,而且该列必须得在输出列表中;
@vc_select_column_list :返回列的列名列表;
@vc_select_table_list:要查询的表名;
@vc_condition:查询条件的字符串,必须要有查询条列,否则会抛出异常;
@page_size:每页显示记录的条数;
@current_page:当前页的页码;
@total1:所有符合条件的记录的总数。
构造的sql语句=select top 每页显示记录的条数 * from (select top 每页显示记录的条数 返回列的列名列表 from 要查询的表名 where 要排序列的列名 in (select top 每页显示记录的条数 X 当前页的页码 要排序列的列名 from 要查询的表名 where 查询条件 order by 要排序列的列名) order by 要排序列的列名 desc ) as temp1 order by 要排序列的列名
)
*/
AS
--声明要用到的变量,@temp1是正常的分页语句字符串,@temp2是最后一页的分页语句字符串,@page_total表一共有几页,@last_page
--是最后一页的页码
declare @temp1 varchar(500),@temp2 nvarchar(500),@page_total int,@last_page int
--构造获得总页的数的检索语句
set @temp2=N'select @total2=count(*) from ' + @vc_select_table_list + ' where ' + @vc_condition
--执行检索语句,取得总的记录条数
exec sp_executesql @temp2,N' @total2 int output ',@total1 output/*构造分页检索语句,基本原理是先取出@page_size*@current_page条记录,相当于是取出当前页及当前页前面的所有页面的记录然后取出当前面所要显示的记录,也就是反序排序后取前@page_size条记录;最后再反序排序(因为前面的顺序被反排过一次,现在再反排一次,正好是我们要的顺序),最后执行,返回结果集。
*/
if @total1>0
begin
set @page_total=(@total1+@page_size-1)/@page_size
--如果当前页不是最后一页
if @current_page<@page_total
set @temp1='select top ' + cast(@page_size as varchar(4)) + ' * from
(select top ' + cast(@page_size as varchar(4)) + ' ' + @vc_select_column_list + ' from ' + @vc_select_table_list +' where ' + @vc_order_column_name
+ ' in (select top ' + cast(@page_size*@current_page as varchar(10)) + ' ' + @vc_order_column_name + ' from ' +
@vc_select_table_list + ' where '+ @vc_condition + ' order by ' +
@vc_order_column_name + ') order by ' + @vc_order_column_name + ' DESC) as temp1 order by ' + @vc_order_column_name
else
--最后一页只返回分页后的最后几条记录,也就是@total1%@page_size条记录
begin
set @last_page=@total1%@page_size
set @temp1='select top ' + cast(@last_page as varchar(4)) + ' * from
(select top ' + cast(@last_page as varchar(4)) + ' ' + @vc_select_column_list + ' from ' + @vc_select_table_list +' where ' + @vc_order_column_name
+ ' in (select top ' + cast(@total1 as varchar(10)) + ' ' + @vc_order_column_name + ' from ' +
@vc_select_table_list + ' where '+ @vc_condition + ' order by ' +
@vc_order_column_name + ') order by ' + @vc_order_column_name + ' DESC) as temp1 order by ' + @vc_order_column_name
end
--执行检索
exec(@temp1)
end
else
return
//查询的表名
str_table_name="employees";
//返回的列名列表
str_column_list="employeeid,firstname,lastname,title";
//排序列的列名
str_order_column="employeeid";
//查询的表件
str_condition="employeeid>0";
string strConn = "DATABASE=Northwind;SERVER=localhost;UID=sa;PWD=;";
SqlConnection conn = new SqlConnection(strConn);
//声明执行存储过程的SqlCommand
SqlCommand scd_sel=new SqlCommand("up_custompage",conn);
scd_sel.CommandType=CommandType.StoredProcedure;
//给存储过程的参数赋值
SqlParameter sp_temp;
sp_temp=scd_sel.Parameters.Add("@vc_order_column_name",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_order_column;
sp_temp=scd_sel.Parameters.Add("@vc_select_column_list",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_column_list;
sp_temp=scd_sel.Parameters.Add("@vc_select_table_list",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_table_name;
sp_temp=scd_sel.Parameters.Add("@vc_condition",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_condition;
sp_temp=scd_sel.Parameters.Add("@page_size",SqlDbType.Int);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=grid.PageSize;
sp_temp=scd_sel.Parameters.Add("@current_page",SqlDbType.Int);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=current_page;
sp_temp=scd_sel.Parameters.Add("@total1",SqlDbType.Int);
sp_temp.Direction=ParameterDirection.Output;
//执行存储过程
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=scd_sel;
if (conn.State==ConnectionState.Closed)
conn.Open();
DataSet ds=new DataSet();
sda.Fill(ds,"tb1");
conn.Close();
//设置VirtualItemCount属性
grid.VirtualItemCount=(int)scd_sel.Parameters["@total1"].Value;
//绑定数据源
grid.DataSource=ds.Tables["tb1"].DefaultView;
grid.DataBind();
Pcount = (int)cmd.Parameters["@PageCount"].Value;该成上边的还是不行 :(最好是用DataReader对象实现分页。