数据库存储过程返回记录集的问题
原码如下:
Dim oConn,oCmd,oParam,oRcset
Set oConn=Server.CreateObject ("ADODB.Connection")
oConn.Open Session("DNS")
Set oCmd = Server.CreateObject("ADODB.Command")
Set oCmd.ActiveConnection = oConn
oCmd.CommandText ="p_Business"
oCmd.CommandType =adCmdStoredProc
Set oParam=Server.CreateObject ("ADODB.Parameter")
Set oParam=oCmd.CreateParameter ("@DoType",adInteger,adParamInput ,8,0)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@Page",adInteger,adParamInput ,8,page)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@PageSize",adInteger,adParamInput ,8,10)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@UID",adInteger ,adParamInput ,8,Session("U_ID"))
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@Kind",adVarChar ,adParamInput ,20,"")
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@ReturnCount",adInteger ,adParamOutput ,8)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@PageCount",adInteger ,adParamOutput ,8)
oCmd.Parameters.append oParam
set oRcset=Server.CreateObject ("ADODB.RecordSet")
set oRcset = oCmd.Execute()
dim TotalRecord, TotalPage
TotalRecord=oCmd("@ReturnCount")
TotalPage=oCmd("@PageCount")
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
While not oRcset.EOF '这里出错?为什么?
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'略。。。
oRcset.MoveNext
Wend
'为什么一对oRcset对象操作就报错!
'存储过程如何返回记录集给ASP应用程序
问题点数:100、回复次数:18Top
1 楼freezwy(网络自由人)回复于 2002-07-02 11:11:41 得分 0
使用set oRcset = oCmd.Execute()
不用创建对象,如果是SP分页,请给出SP源代码Top
2 楼gshope(北京.Net)回复于 2002-07-02 11:13:59 得分 0
先在SQL运行p_Business,看返回的数据对不对,
Top
3 楼dephi(四眼田鸡)回复于 2002-07-02 11:15:15 得分 0
我把set oRcset=Server.CreateObject ("ADODB.RecordSet")注释掉
可错误依旧
Top
4 楼dephi(四眼田鸡)回复于 2002-07-02 11:18:39 得分 0
在SQL上运行p_Business,返回的数据数据完全正确
Top
5 楼dephi(四眼田鸡)回复于 2002-07-02 11:25:05 得分 0
存储过程:
PROCEDURE p_Business
@DoType int,
-- 0:Show All 1:Select by Kind
@Page int,
@PageSize int,
@UID int,
@Kind varchar(10),
@ReturnCount int output,
@PageCount int output
AS
declare @iStart int
declare @iEnd int
declare @iPageCount int
create table #tempBusiness(
ID int IDENTITY,
M_ID int,
Kind varchar(10),
M_Name varchar(100),
Introduction varchar(500),
Needtime float,
Num_new int,
New_M int,
Hot_M int,
KindName varchar(20)
)
if @DoType=0
begin
insert into #tempBusiness (M_ID, Kind, M_Name,
Introduction, NeedTime, Num_New, New_M, Hot_M, KindName)
Select m.M_ID, m.Kind, m.M_Name, m.MarketPrice, m.Price, m.Price_New,
m.Introduction, m.NeedTime, m.Num_New, m.New_M, m.Hot_M, k.KindName
from Merchandise m,Kind k
where m.U_ID=@UID and m.Kind=k.K_ID
set @ReturnCount=@@rowcount
Set @iPageCount=@ReturnCount
end
if @DoType=1
begin
insert into #tempBusiness (M_ID, Kind, M_Name,
Introduction, NeedTime, Num_New, New_M, Hot_M, KindName)
Select m.M_ID, m.Kind, m.M_Name, m.MarketPrice, m.Price, m.Price_New,
m.Introduction, m.NeedTime, m.Num_New, m.New_M, m.Hot_M, k.KindName
from Merchandise m,Kind k
where m.U_ID=@UID and m.Kind=k.K_ID and m.Kind=@Kind
set @ReturnCount=@@rowcount
Set @iPageCount=@ReturnCount
end
set @iPageCount=CEILING(@iPageCount/@PageSize)+1
set @PageCount=@iPageCount
if @Page>@iPageCount
set @Page=@iPageCount
set @iStart=(@Page-1)*@PageSize
set @iEnd=@iStart+@PageSize+1
select M_ID, Kind, M_Name,
Introduction, NeedTime, Num_New, New_M, Hot_M, KindName
FROM #tempBusiness
WHERE [ID]>@iStart AND [ID]<@iEnd
DROP TABLE #tempBusinessTop
6 楼nittystone(没有想法)回复于 2002-07-02 11:25:24 得分 100
这儿出错是因为rs不是一个记录集
可能得原因
1.存储过程没有返回记录集合
2.存储过程里面有 print
3.存储过程里面应该有 set nocount on
这样才能返回记录集
存储过程返回得记录集合怎么才能分页?
这样:
set Rs = server.createobject("ADODB.RecordSet")
Rs.CursorType =3
Rs.LockType =3
Rs.CursorLocation =3
set Rs.Source =cmdExec 'cmdExec 为command 对象
Rs.Open
给分!!!
Top
7 楼dephi(四眼田鸡)回复于 2002-07-02 11:51:19 得分 0
楼上的老大
那为什么返回值没了呢?
比如:@ReturnCount 返回为空Top
8 楼ssm1226(雨中人(虚心学习))回复于 2002-07-02 12:09:36 得分 0
存储过程分页思路:
1、参数@PageNo,@PageSie,
2、获取符合条件的记录总数
使用set rowcount 获取最大及最小ID
最后获取中使用ID>minID and ID<maxIDTop
9 楼ssm1226(雨中人(虚心学习))回复于 2002-07-02 12:11:15 得分 0
注意,使用以上分页时,ID在表中值唯一Top
10 楼nittystone(没有想法)回复于 2002-07-02 12:18:10 得分 0
怎么每找到你声明这个返回参数啊。。
下面的用这个
oCmd.Parameter.Refresh()
效率低了一点点 ,不容仪出错。
Set oParam=Server.CreateObject ("ADODB.Parameter")
Set oParam=oCmd.CreateParameter ("@DoType",adInteger,adParamInput ,8,0)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@Page",adInteger,adParamInput ,8,page)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@PageSize",adInteger,adParamInput ,8,10)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@UID",adInteger ,adParamInput ,8,Session("U_ID"))
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@Kind",adVarChar ,adParamInput ,20,"")
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@ReturnCount",adInteger ,adParamOutput ,8)
oCmd.Parameters.append oParam
Set oParam=oCmd.CreateParameter ("@PageCount",adInteger ,adParamOutput ,8)
oCmd.Parameters.append oParam
Top
11 楼leeeel(我笑你多情)回复于 2002-07-02 12:21:28 得分 0
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
While not oRcset.EOF '这里出错?为什么?
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'略。。。
oRcset.MoveNext
Wend
调试一下:
While not oRcset is Nothing
While not oRcset.EOF
oRcset.MoveNext
Wend
oRcset.NextRecordSet
Wend
'还会出错的话就怪了
Top
12 楼dephi(四眼田鸡)回复于 2002-07-02 12:29:05 得分 0
现在记录集有了
可返回值没了
Top
13 楼leeeel(我笑你多情)回复于 2002-07-02 12:40:34 得分 0
可返回值没了?
什么返回值呢?
把返回值改成
select @aaa=''
就能取到了Top
14 楼leeeel(我笑你多情)回复于 2002-07-02 12:44:27 得分 0
你dim TotalRecord, TotalPage
TotalRecord=oCmd("@ReturnCount")
TotalPage=oCmd("@PageCount")
中多了个圈@吧?(我也不太清楚)
在记录集里返回算了!
不要所谓的返回参数。
Top
15 楼nittystone(没有想法)回复于 2002-07-02 12:53:47 得分 0
不知道维什莫
不过我在开发中也用 返回一个一航一列的记录集来用Top
16 楼S.F.(chinasf.cnblogs.com)回复于 2002-07-02 14:04:38 得分 0
echo off
echo onTop
17 楼linfei(林飞)回复于 2002-07-02 14:42:33 得分 0
这么写:
oRcset.open oCmd
如果要分页,可以这么写:
oRcset.CursorType=3
oRcset.open oCmdTop




