极其郁闷的一个问题,关于数据库操作的,高手请进!!!

lovcal 2006-06-12 03:11:19
使用Cell插件显示报表,报表由存储过程产生,Asp中调用数据库的存储过程,做如下测试:
<1>存储过程执行<1秒,则Asp显示出数据所用的时间<2秒,根据数据量而定
<2>存储过程执行2-3秒,则Asp显示出数据所用的时间竟然是15秒

注意,上面返回的记录数都是10条,显示的时间应该与记录的条数无关

我直接使用如下语句执行存储过程的(不知道这有没关系)
set rs=Server.CreateObject ("adodb.recordset")
sql='exec procedure 参数1、参数2……'
rs.Open sql,conn,1,1

另外,由于上面方法没办法返回记录的数量,我用了个遍历记录的循环来获取记录条数,
发觉上面<1>和<2>的情况下,都返回10条记录的话,<1>中遍历记录的时间小于1秒,<2>中遍历记录却要2秒,页面显示更加是成好几倍的关系

个人感觉:存储过程执行时间为2-3秒的情况下,Asp访问返回来的记录集(因为cell中是一个个数据显示的)的效率低的太多了,请问这是怎么回事呀?这问题迷惑了好久了,郁闷!
...全文
380 26 打赏 收藏 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovcal 2006-06-14
  • 打赏
  • 举报
回复
7301989
lovcal 2006-06-14
  • 打赏
  • 举报
回复
我加你了啊,但你一直不在线
jinfeng003 2006-06-14
  • 打赏
  • 举报
回复
lovcal 在啊~~上QQ交流~~

42933577

等你好几天了~~~
lovcal 2006-06-14
  • 打赏
  • 举报
回复
楼上的, exec mp_SaleReport sReportName,FromDate,ToDate,sSaleType 是不能执行的。
有根据么?

这是执行存储过程最简单的方法啊、直接用adorecordset执行即可

adocommand执行存储过程返回的记录集好像只能顺序访问,不能返回头啊??????
music000 2006-06-13
  • 打赏
  • 举报
回复
-------------------------------------------------
conn---省略

set cmd=server.CreateObject("ADODB.Command")
cmd.CommandText="dbo.MP_SaleReport"
cmd.CommandType=adCmdStoredProc
set cmd.ActiveConnection=conn

cmd.Parameters.Append cmd.CreateParameter ("@sCellFileName",adVarChar,adParamInput,20,sReportName)
cmd.Parameters.Append cmd.CreateParameter ("@dStartDate",adVarChar,adParamInput,30,FromDate)
cmd.Parameters.Append cmd.CreateParameter ("@dEndDate",adVarChar,adParamInput,30,ToDate)
cmd.Parameters.Append cmd.CreateParameter ("@param1",adVarChar,adParamInput,1,sSaleType)

set rs=cmd.Execute()

我原来的语句"exec mp_SaleReport sReportName,FromDate,ToDate,sSaleType" 就可以执行的,按上边的写执行之后怎么不行啊
------------------------------------------------------------------

cmd.Parameters.Append cmd.CreateParameter(,,,)括号内只有四个参数,分别为:
@param1,
数据类型(adInteger,adVarChar...),
输入或输出(adParamInput或adParamutnput),
长度(一般adInteger 不用输入)。

另外:使用 cmd.Parameters.Append cmd.CreateParameter()之后,只需要指明cmd.CommandText="mp_SaleReport" (mp_SaleReport为存储过程名)即可,
而 exec mp_SaleReport sReportName,FromDate,ToDate,sSaleType 是不能执行的。

在存储过程建立一个输出参数,用来统计记录数。
shanshuiboy 2006-06-13
  • 打赏
  • 举报
回复
支持楼主,帮顶
jinfeng003 2006-06-12
  • 打赏
  • 举报
回复
Create procedure ABC
@i int OUTPUT
as
select @i=count(*) from tab
-----------------------------------------

set cmd=server.CreateObject("ADODB.Command")
cmd.CommandText="ABC" '存储过程名
cmd.CommandType=adCmdStoredProc '这儿也换成枚举值吧
set cmd.ActiveConnection=conn

set pp=cmd.CreateParameter("@i",adInteger,adParamOutput) '这儿也改,就这几个参数够了
cmd.Parameters.Append pp
..................
cmd.Execute

a=cmd.Parameters.Item("@i")
a就是条目数了
lovcal 2006-06-12
  • 打赏
  • 举报
回复
不是,我就是显示一个报表,以前遍历的原因不过是因为直接用adorecordset执行sql语句的方式没法获取 rs.recordcount,所以改用adocommand的啊,只是就刚刚测试陡然的出现过一次成功的,当时只有一个参数,后来改回正确的存储过程却又不行了

楼上老兄能否给我一个能运行的例子,四个参数(字符串,字符串、字符串、整型)
我发现我找了任何例子,就是不行,狂郁闷,以前就遇着过,当时没搞定,当时只能用set rs=Server.CreateObject ("adodb.recordset")
sql='exec procedure 参数1、参数2……'
rs.Open sql,conn,1,1 --方法来执行,然后遍历rs来获取记录数,现在改成adocommand的却怎么也不行,汗……
jinfeng003 2006-06-12
  • 打赏
  • 举报
回复
这样,你不是要统计记录数么
写存储过程的时候加上一个OUTPUT类型的参数,用它来接收记录数返回
类似于按址传递的参数

create procedure ABC
@i int output
as
select @i=count(*) from tab where .......

还是用cmd对象传入这个参数
execute以后再用
a=cmd.parameters.item("@i")接收

这样肯定比遍历的方式效率高得多~~~
lovcal 2006-06-12
  • 打赏
  • 举报
回复
汗……还是不行,郁闷的asp
lovcal 2006-06-12
  • 打赏
  • 举报
回复
汗……谢谢jinfeng003(小高手)兄,就是不认识,要用数字才行,我看看用原来的存储过程效果如何
lovcal 2006-06-12
  • 打赏
  • 举报
回复
set cmd=server.CreateObject("ADODB.Command")
cmd.CommandText="dbo.test" '存储过程名
cmd.CommandType=adCmdStoredProc
set cmd.ActiveConnection=conn
dim pp

set pp=cmd.CreateParameter ("@p",adInteger,adParamInput,1,1)
cmd.Parameters.Append pp

response.Write "1:"&Now()&"<br>"
set rs=cmd.Execute()
response.Write "2:"&Now()&"<br>"

dim rc
rc=rs.RecordCount
response.Write "3:"&Now()&"<br>"
response.Write "f:"&rs(1)&"<br>" --这儿应该显示的吧,发觉什么也没有,连f都不显示
response.End

存储过程如下:
CREATE PROCEDURE dbo.test
@p int
AS
begin
select 1 as sUserName
return
end
jinfeng003 2006-06-12
  • 打赏
  • 举报
回复
ASP页面里边可能不识别
adVarChar,adParamInput,adCmdStoredProc之类的,换成枚举值试试

再不行就贴出来错误~~~
lovcal 2006-06-12
  • 打赏
  • 举报
回复
conn---省略

set cmd=server.CreateObject("ADODB.Command")
cmd.CommandText="dbo.MP_SaleReport"
cmd.CommandType=adCmdStoredProc
set cmd.ActiveConnection=conn

cmd.Parameters.Append cmd.CreateParameter ("@sCellFileName",adVarChar,adParamInput,20,sReportName)
cmd.Parameters.Append cmd.CreateParameter ("@dStartDate",adVarChar,adParamInput,30,FromDate)
cmd.Parameters.Append cmd.CreateParameter ("@dEndDate",adVarChar,adParamInput,30,ToDate)
cmd.Parameters.Append cmd.CreateParameter ("@param1",adVarChar,adParamInput,1,sSaleType)

set rs=cmd.Execute()

我原来的语句"exec mp_SaleReport sReportName,FromDate,ToDate,sSaleType" 就可以执行的,按上边的写执行之后怎么不行啊
木头的IT笔记 2006-06-12
  • 打赏
  • 举报
回复
jinfeng003,赞成!!
lovcal 2006-06-12
  • 打赏
  • 举报
回复
taolixiang(飞扬): 应该不是,我只是该了存储过程才会导致这样的
邦迪代驾 2006-06-12
  • 打赏
  • 举报
回复
看看循环是不是出了问题
lovcal 2006-06-12
  • 打赏
  • 举报
回复
eglic(圪圪) (理由永远是谎言,信仰永远是自慰)老兄:如何啊,请指点啊,我快郁闷四了
lovcal 2006-06-12
  • 打赏
  • 举报
回复
jinfeng003(小高手):使用command来执行效率有很大改变么?我也怀疑过是这问题,没什么方法的话我就改了看看
lovcal 2006-06-12
  • 打赏
  • 举报
回复
其实原来是比较正常的,后来加了2列汇总数据,所以我修改了存储过程,并且存储过程执行时间增大了,我在SQLServer的查询分析器中看到的,原来存储过程执行时间<1秒,修改后是2秒
但页面显示时间差别就是比较大了,感到很不解
加载更多回复(6)

28,402

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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