1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

帖子
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8945|回复: 13

[求助]如何将存储过程中的多个结果集返回到Excel

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-8-12 08:57 | 显示全部楼层 |阅读模式

在excel vba中利用ado调用ms sql server中的存储过程(例如sp_helpdb pubs),该存储过程返回多个结果集(结果集的结构并不相同),想把这多个结果集都在excel中显示出来,可是只会显示第1个结果集,不知道如何才能显示出所有结果集,请问该如何修改代码才行?

Sub COPYRESULT()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String, mydata As String
Dim i As Integer
mydata = "excelsql"
cnn.ConnectionString = "provider=sqloledb;user id=sa;password=excel;data source=worker;initial catalog=" & mydata
cnn.Open
SQL = "UP_JZYYL"
Set rs = cnn.Execute(SQL)
Cells.Clear
For i = 0 To rs.Fields.Count - 1
   Cells(1, i + 1) = rs.Fields(i).Name
Next i
Range("a2").CopyFromRecordset rs
Cells.Columns.AutoFit
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2008-8-12 16:34 | 显示全部楼层

没有这方面的接触,但看你的代码,写入部分

Cells.Clear
For i = 0 To rs.Fields.Count - 1
   Cells(1, i + 1) = rs.Fields(i).Name
Next i
Range("a2").CopyFromRecordset rs

仅执行了一次,当然也就只有一次的结果了。

TA的精华主题

TA的得分主题

发表于 2008-8-12 16:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-14 20:18 | 显示全部楼层
QUOTE:
以下是引用烟雨厦江南在2008-8-12 16:41:13的发言:
rs.NextRecordset可继续导入下一个结果集中的数据

谢谢,已初步会使用,但是有个问题,假如事先不知道存储过程会返回多少个结果集,该怎样遍历取得所有结果集(不是某个结果集内的所有记录)?总觉得应该是一个循环,但不知道循环条件是什么,该怎么写,极盼赐教!

TA的精华主题

TA的得分主题

发表于 2008-8-18 14:18 | 显示全部楼层

循环的终止条件是判断rs.STATE=nothing,真则结束

TA的精华主题

TA的得分主题

发表于 2008-8-18 14:30 | 显示全部楼层

  rs.NextRecordset

   Do Until rs Is Nothing
   ...
   循环体
   ...
   Loop

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-19 14:43 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-20 12:44 | 显示全部楼层
QUOTE:
以下是引用烟雨厦江南在2008-8-18 14:18:59的发言:

循环的终止条件是判断rs.STATE=nothing,真则结束

使用do until rs.state=nothing

       ...

      loop

提示“编译错误,对象使用无效”,语句停留在nothing上,是什么原因?

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-20 12:50 | 显示全部楼层
QUOTE:
以下是引用烟雨厦江南在2008-8-18 14:30:17的发言:

  rs.NextRecordset

   Do Until rs Is Nothing
   ...
   循环体
   ...
   Loop

使用Set rs = cnn.Execute(SQL)

       do until rs is nothing

       ......

       rs=rs.nextrecordset

      loop

提示“对象关闭时不允许操作”,语句停留在Range("A" & j + 1).CopyFromRecordset rs上,为何?

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-20 12:57 | 显示全部楼层

使用Set rs = cnn.Execute(SQL)

       do until rs.State = 0

       ......

       rs=rs.nextrecordset

      loop

      ......

      rs.close

可以正确返回结果,但语句运行时报错,错误停留在rs.close上,提示“对象关闭时不允许操作”,把rs.close这句删除后,可以返回正确结果,也没有报错,这就感到疑惑了,在遍历rs.nextrecordset后,rs会自己关闭吗?

另外,rs.state=0这句中的0是我自己胡乱写上去的,没想到可以正确返回结果,那么rs.state总共可以取哪些值呢,又分别表示什么意思呢?

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-27 22:23 , Processed in 0.023699 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表