关于asp.net应用程序存储过程做高效分页

作者&投稿:郅视 (若有异议请与网页底部的电邮联系)
毕业项目求c#高效分页,不要存储过程,只想要后台的~

///
/// 根据sql取分页数据,第一个表是取的分页数据,第二个表第一列是数据总数, 如果sql出错,抛出异常,自动把select * from 表 where条件 order by 列 转换成 select count(1) from 表 where 条件
///
/// sql语句,最外层的sql语句,查询条件后,有且只有 order by
/// 要取的第几页的数据,从1开始
/// 每页显示行数
///
public static DataSet GetPageDataSet(string sql,int aPage,int aPageSize)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(sql, con))
{
DataSet ds = new DataSet();
con.Open();
try
{
int posOfSelect = sql.IndexOf("select", StringComparison.CurrentCultureIgnoreCase);
int posOfFrom = sql.IndexOf("from", StringComparison.CurrentCultureIgnoreCase);
int posOfOrder = sql.LastIndexOf(" order by", StringComparison.CurrentCultureIgnoreCase);
string countSql = sql.Substring(0, posOfSelect + 7);
countSql += " count(1) ";
countSql += sql.Substring(posOfFrom, posOfOrder - posOfFrom + 1);
DataTable dtCount = new DataTable();
dtCount.TableName = "tbCount";
cmd.CommandText = countSql;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dtCount);
int page = aPage;
int TotalRowCount = int.Parse(dtCount.Rows[0][0].ToString());
if (TotalRowCount <= ((aPage - 1) * aPageSize))
{
page = 1;
}
cmd.CommandText = sql;
da = new SqlDataAdapter(cmd);
da.Fill(ds, (aPage - 1) * aPageSize, aPageSize, "first");
ds.Tables.Add(dtCount);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
}
}
}

分页控件写的分页,是真的分页。效率如果想再提升,就是优化你的查询代码或者对常用字段添加索引什么的了。剩下的效率问题,已经与分页没有直接关系了。

ASP.net 的DataGrid 控件的内置分页功能一直不被看好,原因是它先把所有数据从数据库读出来再进行分页。在数据量很大的情况下,用它内置的分页功能被认为几乎是不可能的事。对海量数据的读取和分页,大家会通过自定义分页来实现。其核心技术是SQL语句的设计。一般有三种方案:
方案一:(利用SQL的游标存储过程分页)
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
-------------------------------------
方案二:(利用SELECT TOP和Not In分页)
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分页方案三:(利用SELECT TOP和ID>MAX(id)分页)
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID

有网友通过SQL 查询分析器进行比较,得出结论:
方案三(利用ID>MAX(id))效率最高;
方案二(利用Not In) 效率次之;
方案一(利用SQL的游标存储过程分页)最为通用,但效率最差。
事实果真是这样吗?这三种方案就是比DataGrid 控件的内置分页功能好吗?我以前用Access做程序时发现Not in语句效率很低的呀?于是决定亲自试一试。

装SQL有点麻烦,就用 Access 吧,方案一用存储过程分页没有试验。
用Access新建一Book.mdb文件,打开后建一表mytable,加入五个字段:ID,name,author,islend,username。建好表后向内灌入一定数量的记录,以方案二、方案三和DataGrid 控件的内置分页功能分别写一个 .aspx 文件,同时写一 .asp 文件进行比较。
测试条件:P4 2.4G,256MDDR,WindowsXP,IIS,每页20条记录。
ID>MAX(id)语句:string sqlstr="Select Top "+PageSize+" * from mytable where(ID >(select MAX(ID) from(select top "+(PageSize*CurrentPage)+" ID from mytable order by ID asc))) order by ID asc";
Not In语句:string sqlstr="Select Top "+PageSize+" * from mytable where ID not in(select top "+(PageSize*CurrentPage)+" ID from mytable order by ID asc) order by ID asc";

运行结果如下:
方案 记录条数及换页时间
100万 276000 10万 1000
ID>MAX(ID) 16秒 3秒 1秒 <1秒
not in 未打开网页 未打开网页 未打开网页 >1秒
DataGrid内置分页 未打开网页 23秒 5秒 <1秒
asp分页 未打开网页 3秒 1秒 <1秒

通过比较可见,DataGrid 控件的内置分页功能的确不怎么样,但比起一直比较流行的 Not in 语句分页是好多了,至少在20多万条记录的情况下能显示网页。 有人说asp.net 因为是编译执行,运行速度上比asp要快。通过测试没发现快多少。

另:据说 DataList 控件比 DataGrid 控件数据显示性能方面要好一些,可能是真的。我对这两个控件也分别进行了测试,没感觉有多大差异,至少在27万条记录的情况下觉不出来。

难道想象和现实之间的差距真的这么大吗?

原文地址: http://hi.baidu.com/xxu88/blog/item/462495356d5c801090ef39ad.html

根据三层架构的思想个人觉得应该是要 分开写的的吧。 纯粹是个人观点,楼主不要收到我误导了,呵呵


什么是Asp.net?
·强大而富有弹性。由于asp.net是基于(CLR)的,因此整个.net平台的强大和富有弹性,同样可以应用于web应用程序开发者。.net框架的类库、消息以及数据访问解决方案,都可以无缝集成到web。Asp.net也是语言中立的,因此你可以选择你最熟悉的语言,或者通过几种语言来共同完成一个应用。而且,CLR的互用性可以...

Asp.net应用程序运行周期开始于(),终止于(),同时触发Application_End事件...
在aspnet网站目录中添加一个Global.asax的文件,其中 Application_Start(object sender, EventArgs e)应用程序开始 Application_End(object sender, EventArgs e)应用程序结束 Application_Error(object sender, EventArgs e)未处理应用程序错误 等等。在其中填写,相关的处理代码即可。

Asp.net mvc和asp.net有什么区别?
MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上ASP.NET是创建WEB应用的框架而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系,所以可以称之为ASP.NET MVC。可将原来的ASP.NET称为 ASP.NET Webforms,新的MVC 称为ASP.NET MVC。MVC是软件架构的一种模式,可以说就相当于常说...

如何在asp.net中添加全局应用程序类?
如果你是用的asp.net2.0 那么在项目解决方案控制面板中添加一个App_Code系统文件夹,把你的全局应用程序类(比如Global.cs)放在该文件夹中! 假设该类中有个整型转化字符串的方法如下:public static string Int2Str(int i){...} 那么你在其他的代码文件(Default.aspx.cs)中就可以如下调用!string a;...

ASP.NET比拼PHP,谁是速度之王?
Joe在博客中称 一般来说 作性能测试的目的是要尝试证明一方比令一方要快 我受雇于微软 同时编写PHP和ASP NET代码 我在 NET出现之前就在使用PHP 两个东西我都很喜欢 所以 我很难说出哪个更好 当我说PHP好话时 我的微软同事们会写信来批评我 而当我发表倾向于ASP NET的言论时 我的PHP朋友们会说我是微软的...

ASP和asp.net有什么区别的呢?最主要的区别是什么呢?
ASP和asp.net的区别从编程语言种类,服务器,硬件环境的这三方面看区别,其中编程语言种类的区别是最主要的。第一,从编程语言种类看区别。ASP用VBScript、JavaScript等简单容易的脚本语言。结合HTML代码,即可快速完成网站的应用程序,实现动态网页技术。ASP.NET所支持的编程语言是指这种语言的功能全集(而不...

asp.net 和.net和C#.net和C#有什么不一样。
1、asp.net是一种用来快速创建动态Web网站的技术,不是语言,它使用C#(或者vb.net)为开发语言。asp.net是.net平台下的一个框架,是用于开发Bs网站的一种技术。2、C#是一种面向对象的编程语言;3、net只是一个框架,一个开发平台,.net中所有的编程语言,比如c# vb.net等编写的程序必须在.net ...

基于asp.net 的 需求分析 设计 报告
【摘 要】ASP.NET是现在最新最热门的电子商务网站构建技术之一,与微软的SQL Server数据库集成有很好的表现。文章主要探讨了ASP.NET和SQL Server的相关技术,及优化网站性能的技巧。【关键词】电子商务网站;ASP.NET;MS SQL Server;会话;连接池 【作者简介】卢莉,供职于华南师范大学增城学院。随着...

在ASP.NET中 访问站点时,保存应用信息的对象是?
在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等。下面分别介绍它们的用法和区别。 方法 信息量大小 作用域和保存时间 应用范围 保存位置 Application 任意大小 整个应用程序的生命期 整个应用程序\/所有用户 服务器端 Cache 任意大小 可以根据需要设定 整个应用程序\/所有用户 ...

PHP、JAVA和ASP.NET之间的区别?具体点的 谢谢!
3、ASP.NET:基于.NET Framework的Web开发平台,不但吸收了ASP以前版本的最大优点并参照Java、VB语言的开发优势加入了许多新的特色,同时也修正了以前的ASP版本的运行错误。三、优势不同 1、PHP:独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。2、JAVA...

雁塔区15888611424: ASP.net存储过程是什么???我不太懂ASP.net存储过程
喻泊神曲: 存储过程不是asp.net中的名词 存储过程是数据库中的一个功能. 存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存...

雁塔区15888611424: asp.net中如何使用存储过程? -
喻泊神曲: 存储过程是在数据库里面建立的,可用视图方式,可以用执行语句 如在SQL里面建立一个查询表tb_Name的信息的通过表的主键T_ID存储过程为 CREATE PROCEDURE p_Name --存储过程名 @T_ID int AS SELECT * FROM tb_Name WHERE ...

雁塔区15888611424: asp.net中如何创建存储过程存储数据 -
喻泊神曲: asp.net 中不能创建存储过程吧,要在数据库中创建,然后在程序中调用

雁塔区15888611424: 在Asp中存储过程的建立是怎样的?
喻泊神曲: 这里只简单介绍如何在Sql Server的企业管理器中如何建立存储过程: (1)打开企业管理器Enterprise manager (2)选择服务器组(SQL Server Group)、服务器、数据库(...

雁塔区15888611424: asp.net中怎样调用存储过程和存储过程的写法 -
喻泊神曲: (1)执行一个没有参数的存储过程的代码如下:SqlConnection conn=new SqlConnection(“connectionString”); SqlDataAdapter da = new SqlDataAdapter(); da.selectCommand = new SqlCommand(); da.selectCommand.Connection = conn; ...

雁塔区15888611424: 关于ASP.NET存储过程 -
喻泊神曲: 在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作.调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存...

雁塔区15888611424: 存储过程是怎么使用的?ASP.NET中
喻泊神曲: SqlCommand salesCommand = new SqlCommand("SalesByCategory", //存储过程的名字connection);salesCommand.CommandType = CommandType.StoredProcedure; //将命令类型设置为存储过程//以下使用SqlParameter对象来传递存...

雁塔区15888611424: 关于asp.net应用程序用存储过程做分页
喻泊神曲: 是的,需要每一种数据类型写存储过程,JQuery写分页可以通用,但是在数据庞大的情况下,效率绝对比存储过程分页低,所以建议还是用存储过程做

雁塔区15888611424: asp.net项目中在什么情况下需要使用存储过程,为什么?在这种情况下比使用SQL语句有什么优势?(希望高手进来讨论下)
喻泊神曲: 写在存储过程里面的不仅是sql语句,也可以是业务逻辑.其实就是将程序端的代码转移到了数据库端,要说查询效率,放在存储过程里面明显比在程序端高很多,预编译问题,减少网络传输次数等.网站对访问速度要求较高适合用存储过程. 也有个缺点,但是我认为也不是缺点,就是切换数据库的时候麻烦了,逻辑都写在存储过程里面,换数据库又要写新的业务逻辑.话说回来,谁会随便切换一个网站的数据库,是吧?

雁塔区15888611424: ASP.NET调用存储过程 -
喻泊神曲: 给你看下我的,用的时候很简单,和你拼sql差别不是很大,就一个属性而已Commandtype这个属性storeprocedure就是调用存储过程,text是sql语句,我的sqlhelper.ExecuteNonQuery的参数, public static int ExecuteNonQuery(string cmmdText, ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网