导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

存储过程返回值的问题

darcymei 2003-12-15 10:08:24
我用vc ado编程
请问如果我在存储过程中返回多个记录集
用一个recordset都能接收到吗?
如果不行该怎么办呢?
谢谢各位了
...全文
22 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
darcymei 2003-12-15
_CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->put_ActiveConnection(_variant_t((IDispatch*)m_ado.m_pConnection));
m_pCommand->CommandText=(_bstr_t)sqlexpress.c_str();
m_pCommand->CommandType=adCmdUnknown;
m_pRecordset=m_pCommand->Execute(0,0,0);
这是我调用存储过程的方法,sql语句肯定没问题,m_ado.m_pConnection也是肯定连通的,整个过程也没抛出异常
那接下来我该如何对recordset操作呢,我想知道上面几句话在vc ado里的对应版本,
此外还有一点小麻烦
我调用此recordset的getrecordcount方法,返回-1,是不是我的执行方法有什么问题!
谢谢各位了
回复
一样的.只是调用的写法不同.功能一样.
回复
darcymei 2003-12-15
谢谢楼上的各位(不过好像都是vb的)
弱弱的问一下
vb和vc调用ado com是一样的吗
上面的方法也适用vc编程把
回复
ghosthjt 2003-12-15
可以接收到的,用ado.nextrecordset
回复
NextRecordset 方法


清除当前 Recordset 对象并通过提前执行命令序列返回下一个记录集。

语法

Set recordset2 = recordset1.NextRecordset( RecordsAffected )

返回值

返回 Recordset 对象。在语法模型中,recordset1 和 recordset2 可以是相同的 Recordset 对象,或者可以使用不同的对象。

参数

RecordsAffected 可选,长整型变量,提供者向其返回当前操作所影响的记录数目。

注意 该参数仅返回受操作影响的记录的数目;它不会从用于生成 Recordset 的选择语句返回记录的计数。

说明

使用 NextRecordset 方法返回复合命令语句中下一条命令的结果,或者是返回多个结果的已存储过程结果。如果使用 Command 的 Execute 方法或者 Recordset 的 Open 方法打开基于复合命令语句(例如“SELECT * FROM table1;SELECT * FROM table2”)的 Recordset 对象,则 ADO 仅执行第一条命令并将结果返回到“记录集”。要访问语句中后续命令的结果,请调用 NextRecordset 方法。

只要有其他的结果,并且包含复合语句的 Recordset 未被跨进程边界调度,则 NextRecordset 方法将继续返回 Recordset 对象。如果行返回命令没有返回记录,则返回的 Recordset 对象将为空;在确认 BOF 和 EOF 都为 True 的情况下可验证这种情况。如果非按行返回命令成功执行,则返回的 Recordset 对象将关闭,通过测试 Recordset 的 State 属性可以测试这种情况。如果没有其他的结果,“记录集”将设置为 Nothing。

远程数据服务用法 NextRecordset 方法对客户端的 Recordset 对象不可用。

如果在立即更新模式下进行编辑,调用 NextRecordset 方法将产生错误。应首先调用 Update 或 CancelUpdate 方法。

如果需要通过填写 Parameters 集合或者通过使用原有的 Open 或 Execute 调用传送数组为复合语句中的多个命令传送参数,则参数在集合或数组中的次序必须与它们在命令序列中各自命令的次序相同。在读取输出参数值之前必须读取所有结果。

在调用 NextRecordset 方法时,ADO 仅执行语句中的下一条命令。如果在单步执行整个命令语句之前显式关闭 Recordset 对象,则 ADO 不执行其余的命令。
回复
NextRecordset 方法范例
该范例使用 NextRecordset 方法,查看使用了由三个独立 SELECT 语句组成的复合命令语句的记录集中的数据。

Public Sub NextRecordsetX()

Dim rstCompound As ADODB.Recordset
Dim strCnn As String
Dim intCount As Integer

' 打开复合记录集。
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "

Set rstCompound = New ADODB.Recordset
rstCompound.Open "SELECT * FROM authors; " & _
"SELECT * FROM stores; " & _
"SELECT * FROM jobs", strCnn, , , adCmdText

' 显示每一个 SELECT 语句的结果。
intCount = 1
Do Until rstCompound Is Nothing
Debug.Print "Contents of recordset #" & intCount
Do While Not rstCompound.EOF
Debug.Print , rstCompound.Fields(0), _
rstCompound.Fields(1)
rstCompound.MoveNext
Loop

Set rstCompound = rstCompound.NextRecordset
intCount = intCount + 1
Loop

End Sub

回复
--能.

--例子:
--存储过程:
create proc p_test
as
select * from 表1
select * from 表2
go

'VB中的调用:
dim rs as new adodb.recordset
rs.open "xec p_test",数据库连接字符串
while rs.state<>0
set rs=rs.nextrecordset
wend
回复
victorycyz 2003-12-15
多设几个recordset类型的变量不是很好吗?
回复
wzh1215 2003-12-15
看,学习!
回复
txlicenhe 2003-12-15
--存储过程例子:
create proc p_test
as
select * from 表1
select * from 表2
select * from 表3
select * from 表4
go

注意不要在存储过程开始加上
set nocount on


用ADO的NextRecordset属性取多结果集:


Dim cmd As New ADODB.Command
Dim rs As ADODB.Recordset

Cmd.ActiveConnection = "DSN=MySamples;UID=sa"
Cmd.CommandText = "MyNextProc"
Cmd.CommandType = adCmdStoredProc

Set rs = Cmd.Execute()
While Not rs Is Nothing
If (Not rs.EOF) Then
Debug.Print rs(0)
End If
Set rs = rs.NextRecordset()
Wend
回复
yoki 2003-12-15
参考Recordset 对象的NextRecordset 方法
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告