登陆 免费注册 提交网站
站长资讯 >> 站长学院 >> 数据库类
 2008-03-30 22:44浏览: 3479 次

ASP调用存储过程分页,实例讲解

关键字:ASP,MSSQL,存储过程,存储过程分页,store procedure。

做网络开发的在分页上要是遇到数(几十)万以上的数据还是用ADO那样的分页会速度很慢的。有了存储过程速度就快多了。下面是本人用50万的数据进行的测试可以用的存储过程(网络上的好多都是不能用)和不用存储过程时间比较,前者0.2~0.7秒左右,后者要8~10秒左右。

在ASP中用ADO的要所需时间:24.516秒

1、存储过程完整代码如下:

以下内容为程序代码:
======开始========================================

/*=================

ASP+MSSQL存储过程分页

===================*/

if exists(select name from sysobjects where name='PagePROC' and type='p')

drop procedure PagePROC

go

create procedure dbo.PagePROC --要修改过程把Create改为alter

(

@TblName varchar(100), --200表名

@ID varchar(50), --200表的主键

@FldName varchar(200)='*', --200要显示的列名,如id,name,tel,....

@StrWhere varchar(500)='', --200排序条件,格式:不用写where

@OrderType int = 0, --11设置排序类型, 1降序,0升

@PageSize int, --3每页显示多少条记录

@CurrentPage int --3当前页,pageNo

)

AS

SET NOCOUNT ON --当 SET NOCOUNT 为 ON 时,存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

declare @strSQL varchar(2000) -- 主语句

declare @strTmp varchar(1000) -- 临时SQL变量

declare @strOrderBy varchar(50) -- 临时排序变量

declare @strOrder varchar(500) -- 排序类型

declare @recordCount varchar(1000) -- 总记录主语句,即RecordCount

--declare @PageCount int -- 总页数

/*--=======判断排条件,格式===========

if @StrWhere <> ''

set @StrWhere=' firstName like ''%'+@StrWhere+'%'' and lastName like ''%'+@StrWhere+'%'''

*/

--=======判断排序条件,格式===========

if @OrderType <> 0 --即降序

begin

set @strOrderBy = '<(select min'

set @strOrder = ' order by ' + @ID + ' desc'

end

else

begin

set @strOrderBy = '>(select max'

set @strOrder = ' order by ' + @ID +' asc'

end

--============默认情况的SQL===========

Set @strTmp =' Select top ' + str(@PageSize) +' '+ @FldName +' from '+ @TblName

--=========判断当前是否第一页,并执行相应的代码,这样会加快执行速度===============

if @CurrentPage =1

Begin

if @StrWhere <> ''

Begin

Set @strSQL=@strTmp +' Where '+@StrWhere+' '+@strOrder

set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName+' Where '+@StrWhere

End

else

Begin

Set @strSQL=@strTmp +' '+@strOrder

set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName

End

End

else

Begin

if @StrWhere <> '' --有where条件查询时

Begin

Set @strSQL=@strTmp + ' where '+@ID+' '+ @strOrderBy+'('+@ID+') from (select top ' + str((@CurrentPage-1)*@PageSize)+' '+@ID+' from '+ @TblName+' Where '+@StrWhere+' '+@strOrder+' ) as tblTmp ) and '+ @StrWhere +' '+ @strOrder

set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName+' Where '+@StrWhere

End

else -----------------------------------------无where条件时

Begin

Set @strSQL=@strTmp + ' where '+@ID+' '+ @strOrderBy+'('+@ID+') from (select top ' + str((@CurrentPage-1)*@PageSize)+' '+@ID+' from '+ @TblName+' '+@strOrder+' ) as tblTmp )'+' '+ @strOrder

set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName

End

End

exec (@strSQL)

exec (@recordCount)

go

========完=================================

2、ASP调用存储存储过程

ASP调用存储存要求是掌握ASP基础,才对下面的部分核心代码看得懂。

ASP调用存储存储过程一般用:adodb.command。如下:

以下内容为程序代码:
'======开始==================

'这里连接数据库

Dim ConnStr,Conn

'''''''''''''''''''''SQL数据库 '''''''''''''''''''''''''''''''''''''''''

'(local)或127.0.0.1或. '连接IP 本地用 (local)或127.0.0.1 或一个点.,外地用IP

'sa '数据库用户名

'123456 '用户密码

ConnStr = "Provider=SQLOLEDB;Server=127.0.0.1;Database=aisila;UID=sa;PWD=123456"

'''''''''''''''''''''''''''''''''''''''''''''''

On Error Resume Next

Set Conn=Server.CreateObject("ADODB.Connection")

Conn.open ConnStr

If Err Then

err.Clear

Set Conn = Nothing

Response.Write ("

数据库连接出错,请检查数据库连接字串ConnStr
")

Response.End

End If

set recom = server.createobject("adodb.command")

recom.activeconnection = ConnStr

recom.commandtype = 4

recom.CommandTimeout = 0

recom.Prepared = true

recom.commandtext = "dbo.PagePROC"

recom.Parameters.Append recom.CreateParameter("@TblName",202,1,100,TblName)

recom.Parameters.Append recom.CreateParameter("@ID",202,1,20,id)

recom.Parameters.Append recom.CreateParameter("@FldName",202,1,100,FldName)

recom.Parameters.Append recom.CreateParameter("@StrWhere",202,1,200,StrWhere)

recom.Parameters.Append recom.CreateParameter("@OrderType",3,1,1,OrderType)

recom.Parameters.Append recom.CreateParameter("@PageSize",3,1,6,PageSizeX)

recom.Parameters.Append recom.CreateParameter("@CurrentPage",3,1,6,PageNo)

'这里给要参数传值

TblName="testtable" '表名

id="ID" '主键名

FldName="id,firstName,lastName" '要显示的列名

StrWhere=“” '条件可以自己写,如:firstName=‘aisila’

OrderType=0 '0为升,1为降

PageSizeX = 10

PageNo = Clng(Request("PageNo"))'int最大值只有到32767.

If PageNo<=0 or PageNo="" Then PageNo=1

set rs = recom.execute()

if rs.eof then

set rs=nothing : set recom=nothing : Conn.Close : set Conn=nothing

response.write "alert('当前没有找到任何记录,请返回重新操作!');history.go(-1);"

response.end

end if

'这里显示数据

while not rs.eof

response.write(""&rs("id")&" FirstName:"&rs("FirstName")&" | lastName: "&rs("lastName")&"


")

rs.movenext

wend

set rs = rs.NextRecordset '取得第2个记录集即总记录。

RecordCount=rs("RecordCount") '得到记录总数,

response.write("共有:"&RecordCount&" 条记录,根据这个请将你个人喜欢的分页代码放在这里")

'这里就是分页了,根据个人的需要自己喜欢的分页摸版。

'最后要关闭连接

set rs=nothing : set recom=nothing : Conn.Close : set Conn=nothing

'==============完==============

上面的调用是部分的核心代码,不是全部的代码。要直接使用请:

1)先将第一点的存储过程到你的MSSQL查询分析器中运行,随便插入几条数据以便分页显示。

2)再拷贝第2点的代码到你的页面上改数据库连接字符串ConnStr 。

网站首页 - 关于我们 - 联系我们 - 友情链接 - 帮助中心
Copyright ©2007-2022 www.Aisila.com All Rights Reserved
苏ICP备20008864号-4