后台如何进行调用存储过程。。传参在哪传。。怎么写。。
解决方案 »
- 急,求一个动态实现的柱状图的实现方法,
- 关于邮件问题
- <pages enableEventValidation= "true "/>
- 最近做一个新闻发布系统,支持生成静态页面,和分页功能,晚点公布源代码。共享共享给大家
- 一个字符串拼接的问题,不好意思我是超菜的那种,希望各位前辈能帮助我,不甚感激
- 原网站DB与论坛DB中的用户表应该如何整合?
- 平时我们书上讲的关闭数据库连接时候, 只做 conn.Close(); 并没有做 conn.Dispose(),要紧吗?
- 请教 Response.ContentType & Response.Redirect
- 我怎么才能使day的格式变成YYYY-MM-DD这种格式呢,哪位大虾指点下,先谢了
- 如何把下面操作owc Chart 排序的vb脚本,转化成javascript脚本?
- 关于button的 onclick 事件和textbox的ontextchanged事件的执行顺序问题
- ASP.NET(C#)客户端如何读串口数据,并写回到数据库?
先看看datagrid的自定义分页的原理,它主要依据两个主要属性,第一个就是VirtualItemCount属性,它表示datagrid一共要显示多少条记录,它就是的作用是用于生成pager(分页导航行),通过结合另外两个属性pagesize和PageButtonCount,datagrid就知道要分成多少页了及当前要显示多少个分页按钮,我们不难得到总共要显示的总页数=(VirtualItemCount+pagesize-1)/pagesize;如要总页数<PageButtonCount,则显示总页数个按钮;如果总页数>PageButtonCount,则显示PageButtonCount个按钮,当然到了最后一页就只显示VirtualItemCount% pagesize(总记录条数除以每页显示记录的余数)个按钮。另一个重要的属性就是datasource(数据源),自定义分页的一个重要的特点是显示数据源中所有的记录,如果数据源中有一条记录,则显示一条记录;如果数据源中有一万条记录,则它会显示一万条记录,可能你的机子就慢了 : )。所以自定义最重要的一点是如何设置或获取数据源了。
接下来,我们先说说自定义分页的主要步骤:
1.设置datagrid的VirtualItemCount属性;
2.获取datagrid的datasource(数据源);
3.绑定数据到datagrid;
4.设置新页的页码(datagrid.currentpageindex属性)。
重复上述2,3,4步。
下面我们以一个例子来讲解datagrid 的自定义过程。
例子要求机子装有ms sql server 7.0 或 2000,当然还要能运行asp.net页了(废话)。
我们先来写一个通用的存储过程,用于分页,返回某页的要显示的记录集,及一个输出参数--总的记录条数,但这个存储过程有缺陷,例如只能用于单表查询,必须要有条件语句等。
CREATE PROCEDURE up_custompage @vc_order_column_name varchar(100),@vc_select_column_list varchar(100),
@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
public DataTable SelectData(string sql, Wuqi.Webdiyer.AspNetPager AspNetPager1)
{
SqlParameter SqlParam = new SqlParameter("@Sql", sql);
SqlParameter PageIndexParam = new SqlParameter("@PageIndex", AspNetPager1.CurrentPageIndex);
SqlParameter PageSizeParam = new SqlParameter("@PageSize", AspNetPager1.PageSize);
DataSet ds = daEx.GetDataSet("PageRecord", CommandType.StoredProcedure, SqlParam, PageIndexParam, PageSizeParam);
Common.CommonClass.InitAspPageInfo(ds, ref AspNetPager1);
return FullRow(ds.Tables[1], AspNetPager1.PageSize);
}public DataTable FullRow(DataTable dt, int Count)
{
for (int i = dt.Rows.Count; i < Count; i++)
{
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
}
return dt;
}
@Sql nvarchar(4000), --查询字符串
@PageIndex int, --第n页
@PageSize int --每页行数
as
set nocount on
declare @p1 int, --p1是游标的id
@rowcount int
exec sp_cursoropen @p1 output,@Sql,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
set @PageIndex=(@PageIndex-1)*@PageSize+1
exec sp_cursorfetch @p1,16,@PageIndex,@PageSize
select @rowcount
--select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
exec sp_cursorclose @p1
set nocount off
百万级 分页存储过程....
http://blog.csdn.net/wellknow/archive/2004/07/29/55167.aspx