急救!高分相送!执行存储过程,返回的recordSet总是说对象已关闭?WHY?

armylau 2003-08-26 10:42:24
我用的是VB6.0 + SQLSERVER2000, 执行一存储过程,其中存储过程带有输出参数.
代码如下:
Dim strCnn As String
Dim cnn As ADODB.Connection
Dim cmdChange As ADODB.Command

Set cmdChange = New ADODB.Command
cmdChange.ActiveConnection = cnn
cmdChange.CommandType = adCmdStoredProc
cmdChange.CommandText = "stu_GetChangeByNO"

cmdChange.Parameters.Append cmdChange.CreateParameter("@stuNo", adChar, adParamInput, 6)
cmdChange.Parameters.Append cmdChange.CreateParameter("@id", adInteger, adParamOutput)
cmdChange.Parameters.Append cmdChange.CreateParameter("@des", adVarChar, adParamOutput, 50)
cmdChange.Parameters.Append cmdChange.CreateParameter("@recordTime", adDate, adParamOutput)
cmdChange.Parameters.Append cmdChange.CreateParameter("@memo", adVarChar, adParamOutput, 1000)

cmdChange.Parameters("@stuNo").Value = txtStuNo.Text
cmdChange.Execute

然后想将recordset绑定到datagrid或adodc上,
使用
Dim rsChange As New ADODB.Recordset
Set rsChange.Source = cmdChange
rsChange.Open
MsgBox rsChange.RecordCount

执行时总是说"对象关闭时,不允许操作"
我晕!不是已经Open了吗? 查了好多资料, 试过好几种方法都搞不定, 请大家帮忙啊.分不够说一声. 有答案立马加!
赶着知道,谢了!
...全文
42 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ouyangyifeiczy 2003-09-03
  • 打赏
  • 举报
回复
碰到这种问题: armylau(冯.城.褐.兰) 说的正确,是SET NOCOUNT ON/OFF问题。
富察咪咪 2003-08-27
  • 打赏
  • 举报
回复
存储过程如果在SQL下运行通过应该没有问题,可能是返回的结果集多于一个
Dim rsChange As New ADODB.Recordset
Set rsChange = cmdChange.Execute '--- HERE
rsChange..NextRecordset '下一个结果集
MsgBox rsChange.RecordCount ' 在此出错
rsChange.close ' --- HERE
armylau 2003-08-27
  • 打赏
  • 举报
回复
好的, 谢谢大家, 今晚调试, 晚上结帐, 不管怎样, 先散分. 有问题再另开贴向大家请教.
嬉皮 2003-08-27
  • 打赏
  • 举报
回复
存储过程返回的结果是单一的值,不能算是ADODB.recorderset 对象
你的目的只是要按 txtStuNo.Text 的值做一次SELECT,然后显示在网格(datagrid)中
可以这样做:
strSQL="SELECT * FROM 表名 WHERE stuNo=" + txtStuNo.Text
set rsChange=new adodb.recorderset
With rsChange
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.ActiveConnection = cn
End With
rsChange.open strSQL

datagrid 控件有一个datasource 属性 (还有几个其他相关属性你自己去研究)
datagrid.datasource=rechange

以上是一大致的思路,你自己去完善,又问题,在帖稿.
liuyongpc 2003-08-27
  • 打赏
  • 举报
回复
CREATE PROCEDURE stu_GetChangeByNO
(
@studentNo char(6),
@id int output,
@des varchar(50) output,
@recordTime datetime output,
@memo varchar(1000) output
)
AS
set nocount on -- 主要加上这句
DECLARE @code char(1)

/*
SELECT @id = id, @code = changeNo, @memo = memo, @recordTime = recordTime
FROM Change
WHERE studentNo = @studentNo
ELECT @des = description
FROM Code_Change
WHERE code = @code*/


select * from change WHERE studentNo = @studentNo
select * FROM Code_Change WHERE code = @code
go
这样的话就能返回集合了你没必要传参数出去,如果参数只有一个值的话可以这样,不过你的问题在delphi里就很容易搞定了!

armylau 2003-08-26
  • 打赏
  • 举报
回复
还有
Dim rsChange As New ADODB.Recordset
Set rsChange = cmdChange.Execute '--- HERE
rsChange.Open ' 改成rsChange.Close也在下面出错..
MsgBox rsChange.RecordCount ' 在此出错
rsChange.close ' --- HERE
armylau 2003-08-26
  • 打赏
  • 举报
回复
TO ywxbutterfly() :
我改了一下,
Set cmdChange = New ADODB.Command
cmdChange.ActiveConnection = cnn
cmdChange.CommandType = adCmdStoredProc
cmdChange.CommandText = "stu_GetChangeByNO"

cmdChange.Parameters.Append cmdChange.CreateParameter("@stuNo", adChar, adParamInput, 6)
cmdChange.Parameters.Append cmdChange.CreateParameter("@id", adInteger, adParamOutput)
cmdChange.Parameters.Append cmdChange.CreateParameter("@des", adVarChar, adParamOutput, 50)
cmdChange.Parameters.Append cmdChange.CreateParameter("@recordTime", adDate, adParamOutput)
cmdChange.Parameters.Append cmdChange.CreateParameter("@memo", adVarChar, adParamOutput, 1000)

cmdChange.Parameters("@stuNo").Value = txtStuNo.Text

Dim rsChange As New ADODB.Recordset
Set rsChange = cmdChange.Execute '--- HERE
rsChange.Open
MsgBox rsChange.RecordCount ' 在此出错
rsChange.close ' --- HERE

还是说"对象已关闭时...", 唉, 头痛...
ywxbutterfly 2003-08-26
  • 打赏
  • 举报
回复
在rsChange.Open
MsgBox rsChange.RecordCount
的后面加上rsChange.close
再用此记录时再打开。
armylau 2003-08-26
  • 打赏
  • 举报
回复
TO girl888(大三女生) :能否解释详细一点? 那句有什么用呢? thx!
girl888 2003-08-26
  • 打赏
  • 举报
回复
rs.close
armylau 2003-08-26
  • 打赏
  • 举报
回复
TO wangqiu: 试过了, 好像不是这个问题
TO jilate&ketao_78, 调试时,发现有数据返回, 如msgbox cmdChange("des").Value是有值返回的.

看了一些以前的文章, 好像是存储过程用了多条SELECT的结果,要用SET COUNT ON/OFF, 但还在调试中... 有没更详细的说明, 谢谢大家.
armylau 2003-08-26
  • 打赏
  • 举报
回复
TO wangqiu: 试过了, 好像不是这个问题
TO jilate&ketao_78, 调试时,发现有数据返回, 如msgbox cmdChange("des").Value是有值返回的.

看了一些以前的文章, 好像是存储过程用了多条SELECT的结果,要用SET COUNT ON/OFF, 但还在调试中... 有没更详细的说明, 谢谢大家.
521613 2003-08-26
  • 打赏
  • 举报
回复
rsChange.Open "sql语句",cnn,1,1
ketao_78 2003-08-26
  • 打赏
  • 举报
回复
先看看返回的数据集
jilate 2003-08-26
  • 打赏
  • 举报
回复
判断recordcount的记录集数,可能是0
或者他的state
wangqiu 2003-08-26
  • 打赏
  • 举报
回复
rsChange.Open应该是他缺少参数吧,

加上参数不就可以了吗??
ymli 2003-08-26
  • 打赏
  • 举报
回复
sorry,没看清题。你的存储过程中并未返回任何记录集,当然无法绑定到recordset.

你可以用
变量=cmdChange.Parameters("@des").Value 的方式返回存储过程中@des 等变量的值。

返回记录集,应用
SELECT id, changeNo, memo, recordTime
FROM Change
WHERE studentNo = @studentNo
返回多个记录集,使用nextrecordset属性。

armylau 2003-08-26
  • 打赏
  • 举报
回复
唉,困扰人的问题...
有没其它方法,可以将带有输出参数的存储过程的数据取出,然后显示在datagrid中呢?
最好给出详细的源码, 我实在没办法了, 谢谢了.
armylau 2003-08-26
  • 打赏
  • 举报
回复
debug了一下,发现cnn的state是 1, 即adstateOpen的...
ymli 2003-08-26
  • 打赏
  • 举报
回复
Confirm cnn is not closed:
......
.ActiveConnection = cnn
.Open cmdChange
加载更多回复(6)

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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