ASP调用存储过程后 如何返回值

mzcih 2008-06-01 11:38:06
在CSDN搜索了一下,没解决问题。

<%
Const LocalName = "mjr"

Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
Set cmd = Server.CreateObject("ADODB.Command")

strconn = "Provider = SQLOLEDB; Data Source = "&LocalName&"; Uid=test01;Pwd=test01;DataBase=test01"
conn.open strconn

//方法1

'SQL = "exec dbo.find_workProduct '00.00.000.0001' , 9 , 0 "
'Set Rs = Conn.Execute(SQL,0,1)

//方法2
cmd.ActiveConnection = conn
cmd.CommandType = 1
cmd.CommandTimeout = 0
cmd.Prepared = true
cmd.CommandText = "exec dbo.find_workProduct '00.00.000.0001' , 9 , 0 "
set rs = cmd.Execute

rs.close //网上搜索说加这句这行,但测试失败

while not rs.eof //无论方法1与2都提示这句出错: ADODB.Recordset 错误 '800a0e78' 对象关闭时,不允许操作。

response.write rs(0) & "<br>"
response.movenext
wend
%>
...全文
588 73 打赏 收藏 转发到动态 举报
写回复
用AI写文章
73 条回复
切换为时间正序
请发表友善的回复…
发表回复
windwl 2008-06-04
  • 打赏
  • 举报
回复
解决了就结贴吧
mzcih 2008-06-04
  • 打赏
  • 举报
回复
谢谢大家,问题解决了。
mzcih 2008-06-03
  • 打赏
  • 举报
回复
谢谢大家的帮助,但问题还未解决。

存储过程如下:

CREATE PROCEDURE [dbo].[Find_WorkProduct]
@wlph varchar(20),@cc int,@rsjt int
as

declare @xx int,@che int,@xx1 int,@gs numeric(16,6),@jjgs numeric(16,6),@rs numeric(16,6)
set @xx=1
Create table #work(order_jl varchar(250),strGysx Varchar(10),che int,strgybh varchar(50),strcpgyh varchar(50), gs numeric(16,4),jjgs numeric(16,4),rs numeric(16,2),cr_na varchar(20),cr_dae datetime)
Create table #work1(m_key int IDENTITY (1, 1) NOT NULL,order_jl varchar(250),strGysx Varchar(10),che int,strgybh varchar(50),strcpgyh varchar(50),strgymq Varchar(100), gs numeric(16,4),jjgs numeric(16,4),rs numeric(16,2),strbb varchar(10),gzgroup varchar(20),gzls numeric(16),cr_na varchar(20),cr_dae datetime)
Create table #work2(m_key int IDENTITY (1, 1) NOT NULL,order_jl varchar(250),strGysx Varchar(10),che int,strgybh varchar(50),strcpgyh varchar(50), strgymq Varchar(100), gs numeric(16,4),jjgs numeric(16,4),rs numeric(16,2),strbb varchar(10),gzgroup varchar(20),gzls numeric(16),cr_na varchar(20),cr_dae datetime)
Insert Into #work(order_jl,strgysx,che,strgybh,strcpgyh,gs,jjgs,rs,cr_na,cr_dae)
Select Case When Len(strGysx)=1 Then '0' Else '' End+strGysx+strgybh,Case When Len(strGysx)=1 Then '0' Else '' End+strGysx,
@xx as che,strgybh,strCpgyh,numGs,numJjgs,intJJrs,
crename,credate from CraftWorkProduct where strcpgyh=@wlph and bdel<>1
while @xx<@cc
begin
set @xx=@xx+1
insert into #work(order_jl,strGysx,che,strgybh,strcpgyh,gs,jjgs,rs,cr_na,cr_dae)
Select #work.order_jl+Case When Len(a.strGysx)=1 Then '0' Else '' End+a.strGysx+a.strgybh as order_jl,Case When Len(a.strGysx)=1 Then '0' Else '' End+a.strGysx,
@xx as che,a.strgybh,a.strCpgyh,a.numGs,a.numJjgs,a.intJJrs,
a.crename,a.credate from #work
Inner join CraftWorkProduct as a on (a.strCpgyh=#work.strGybh)
Where #work.che=@xx-1 and a.bdel<>1
continue
end


Insert into #work1(order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae)
Select a.order_jl,a.strGysx,a.che,a.strgybh,a.strcpgyh,b.strgymq,b.numgs,b.numjjgs,a.rs,c.strname,c.btype,a.cr_na,a.cr_dae From #work as a
Left Join CraftWork as b On a.strGybh=b.strGybh and b.bdel=0
Left Join CraftWorkGroup c On b.intGzz=c.id and c.bdel=0
Order by order_jl
Drop Table #work
Select @xx=Max(m_key),@che=Max(che) from #work1
set @xx1=@xx
set @gs=0
set @jjgs=0
set @rs=0
While @che>1
Begin
While @xx1>0
Begin
While Exists(Select * From #work1 Where m_key=@xx1 and che=@che)
Begin
If @rsjt=0
Select @gs=@gs+gs,@jjgs=@jjgs+jjgs,@rs=@rs+rs From #work1 Where m_key=@xx1 and che=@che
Else
Select @gs=@gs+gs,@jjgs=@jjgs+jjgs,@rs=@rs+rs From #work1 Where m_key=@xx1 and gzls>0 and che=@che
Set @xx1=@xx1-1
End
If (@gs>0)
Begin
Update #work1 Set gs=@gs,jjgs=@jjgs,rs=@rs Where m_key=@xx1
Set @gs=0
Set @jjgs=0
Set @rs=0
End
Set @xx1=@xx1-1
End
Set @che=@che-1
End
If @rsjt=0
Insert into #work2(order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae)
Select order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae From #work1 Order by order_jl
Else
Insert into #work2(order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae)
Select order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae From #work1 Where gzls<>1 or gzls is null Order by order_jl
Select * From #work2
GO
windwl 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 70 楼 chinmo 的回复:]
汗!你题目竟然说是返回值!!!

一直围绕的返回值去想

早帖出存储过程和返回结果就不要饶这么久了!
[/Quote]
请仔细看45.46楼
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 windwl 的回复:]
最后返回的记录集是Select * From #work2 ?吗
[/Quote]
[Quote=引用 58 楼 mzcih 的回复:]
是的,我这样写的存储过程有问题吗?
在SQL执行是正常的。
[/Quote]
你的记录集是Select * From #work2
那是属于返回表结果集,而不是返回值

2个可是不同的哦
  • 打赏
  • 举报
回复
汗!你题目竟然说是返回值!!!

一直围绕的返回值去想

早帖出存储过程和返回结果就不要饶这么久了!
  • 打赏
  • 举报
回复
返回表结果集和返回值是不同的
返回值的话就如我写的那样
  • 打赏
  • 举报
回复
如果在查询分析器中是有返回表结果集.
就在你的存储过程中的最开始加上:
set nocount on

在结尾处加上:
set nocount off
如果你的存储过程返回的是值,而不是表集,那上面的调用就是错的.
  • 打赏
  • 举报
回复
上面写错了

CREATE PROCEDURE dbo.getUserInfo
@userid int,
as
set nocount on
begin
select usertel,usermail
from dbo.[userinfo]
where userid=@userid
end
go

DIM checklg,UserID,UserName,UserTel,UserMail
DIM MyComm,MyRst
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = sqlConn 'sqlConn是数据库连接字串
.CommandText = "getUserInfo" '指定存储过程名
.CommandType = 4 '表明这是一个存储过程
.Prepared = true '要求将SQL命令先行编译
.Parameters.append .CreateParameter("@userid",3,1,4,UserID)
Set MyRst = .Execute
end with
Set MyComm = Nothing
'if not MyRst is Nothing then
'Set MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail = MyRst(1)
response.Write UserTel
'end if
Set MyRst = Nothing
mzcih 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 chinmo 的回复:]
你先把最简单的例子返回值的搞清楚了
你的也就明白了
[/Quote]

谢谢你,但是存储过程的问题。
windwl 2008-06-03
  • 打赏
  • 举报
回复
你BAIDU 一下吧
mzcih 2008-06-03
  • 打赏
  • 举报
回复
原来如此,就加二句就解决了问题。

set nocount on

set nocount off

请问有没有相关的资料说明呢?
windwl 2008-06-03
  • 打赏
  • 举报
回复
是存储过程的问题
当ASP向ODBC取记录集时,ODBC过滤了由create table或insert into产生一些只占位置但不能进行任何操作的记录集,而当ASP向OLEDB取记录集时,OLEDB并没有将这些记录集过滤掉
所以,我们应在存储过程中不希望返回记录集前就执行set nocount on,
禁止存储过程返回记录集;而要返回记录集时,就要先执行set nocount off
mzcih 2008-06-03
  • 打赏
  • 举报
回复
行了,是写法问题吗?但以上的存储过程在VF下调是没问题的。

担心这样改了,会导致其它程序出错。
  • 打赏
  • 举报
回复
你先把最简单的例子返回值的搞清楚了
你的也就明白了
  • 打赏
  • 举报
回复
....你的存储太长了
这样吧我给一个简单的例子,你参考
在userinfo表中增加两个字段:usertel及usermail
CREATE PROCEDURE dbo.getUserInfo
@userid int,
as
set nocount on
begin
select usertel,usermail
from dbo.[userinfo]
where userid=@userid
end
go


DIM checklg,UserID,UserName,UserTel,UserMail
DIM MyComm,MyRst
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = MyConStr 'MyConStr是数据库连接字串
.CommandText = "getUserInfo" '指定存储过程名
.CommandType = 4 '表明这是一个存储过程
.Prepared = true '要求将SQL命令先行编译
.Parameters.append .CreateParameter("@userid",3,1,4,UserID)
Set MyRst = .Execute
end with
Set MyComm = Nothing
if not MyRst is Nothing then
Set MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail = MyRst(1)
end if
Set MyRst = Nothing
windwl 2008-06-03
  • 打赏
  • 举报
回复
CREATE PROCEDURE [dbo].[Find_WorkProduct] 
@wlph varchar(20),@cc int,@rsjt int
as
set nocount on
declare @xx int,@che int,@xx1 int,@gs numeric(16,6),@jjgs numeric(16,6),@rs numeric(16,6)
set @xx=1
Create table #work(order_jl varchar(250),strGysx Varchar(10),che int,strgybh varchar(50),strcpgyh varchar(50), gs numeric(16,4),jjgs numeric(16,4),rs numeric(16,2),cr_na varchar(20),cr_dae datetime)
Create table #work1(m_key int IDENTITY (1, 1) NOT NULL,order_jl varchar(250),strGysx Varchar(10),che int,strgybh varchar(50),strcpgyh varchar(50),strgymq Varchar(100), gs numeric(16,4),jjgs numeric(16,4),rs numeric(16,2),strbb varchar(10),gzgroup varchar(20),gzls numeric(16),cr_na varchar(20),cr_dae datetime)
Create table #work2(m_key int IDENTITY (1, 1) NOT NULL,order_jl varchar(250),strGysx Varchar(10),che int,strgybh varchar(50),strcpgyh varchar(50), strgymq Varchar(100), gs numeric(16,4),jjgs numeric(16,4),rs numeric(16,2),strbb varchar(10),gzgroup varchar(20),gzls numeric(16),cr_na varchar(20),cr_dae datetime)
Insert Into #work(order_jl,strgysx,che,strgybh,strcpgyh,gs,jjgs,rs,cr_na,cr_dae)
Select Case When Len(strGysx)=1 Then '0' Else '' End+strGysx+strgybh,Case When Len(strGysx)=1 Then '0' Else '' End+strGysx,
@xx as che,strgybh,strCpgyh,numGs,numJjgs,intJJrs,
crename,credate from CraftWorkProduct where strcpgyh=@wlph and bdel <>1
while @xx <@cc
begin
set @xx=@xx+1
insert into #work(order_jl,strGysx,che,strgybh,strcpgyh,gs,jjgs,rs,cr_na,cr_dae)
Select #work.order_jl+Case When Len(a.strGysx)=1 Then '0' Else '' End+a.strGysx+a.strgybh as order_jl,Case When Len(a.strGysx)=1 Then '0' Else '' End+a.strGysx,
@xx as che,a.strgybh,a.strCpgyh,a.numGs,a.numJjgs,a.intJJrs,
a.crename,a.credate from #work
Inner join CraftWorkProduct as a on (a.strCpgyh=#work.strGybh)
Where #work.che=@xx-1 and a.bdel <>1
continue
end


Insert into #work1(order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae)
Select a.order_jl,a.strGysx,a.che,a.strgybh,a.strcpgyh,b.strgymq,b.numgs,b.numjjgs,a.rs,c.strname,c.btype,a.cr_na,a.cr_dae From #work as a
Left Join CraftWork as b On a.strGybh=b.strGybh and b.bdel=0
Left Join CraftWorkGroup c On b.intGzz=c.id and c.bdel=0
Order by order_jl
Drop Table #work
Select @xx=Max(m_key),@che=Max(che) from #work1
set @xx1=@xx
set @gs=0
set @jjgs=0
set @rs=0
While @che>1
Begin
While @xx1>0
Begin
While Exists(Select * From #work1 Where m_key=@xx1 and che=@che)
Begin
If @rsjt=0
Select @gs=@gs+gs,@jjgs=@jjgs+jjgs,@rs=@rs+rs From #work1 Where m_key=@xx1 and che=@che
Else
Select @gs=@gs+gs,@jjgs=@jjgs+jjgs,@rs=@rs+rs From #work1 Where m_key=@xx1 and gzls>0 and che=@che
Set @xx1=@xx1-1
End
If (@gs>0)
Begin
Update #work1 Set gs=@gs,jjgs=@jjgs,rs=@rs Where m_key=@xx1
Set @gs=0
Set @jjgs=0
Set @rs=0
End
Set @xx1=@xx1-1
End
Set @che=@che-1
End
If @rsjt=0
Insert into #work2(order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae)
Select order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae From #work1 Order by order_jl
Else
Insert into #work2(order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae)
Select order_jl,strGysx,che,strgybh,strcpgyh,strgymq,gs,jjgs,rs,gzgroup,gzls,cr_na,cr_dae From #work1 Where gzls <>1 or gzls is null Order by order_jl
set nocount off
Select * From #work2
GO

试试看
mzcih 2008-06-03
  • 打赏
  • 举报
回复
是的,我这样写的存储过程有问题吗?
在SQL执行是正常的。
windwl 2008-06-03
  • 打赏
  • 举报
回复
最后返回的记录集是Select * From #work2 ?吗
xie_yanke 2008-06-02
  • 打赏
  • 举报
回复
.....
Set objCmd = Server.CreateObject("Adodb.Command")
With objCmd
.ActiveConnection = Conn
.CommandType = 4
.Prepared = True
.CommandText = "[存储过程名]"
.Parameters.Append = .createparameter("@参数名", [参数], [参数], [参数], 值)
.Parameters.Append = .createparameter("@参数名", [参数], [参数], [参数], 值)
.....
.Execute() '执行
End With
Set objCmd = Nothing
.....
加载更多回复(53)

28,390

社区成员

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

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