无法在与请求的名称或序号对应的集合中找到项目

时间:2014-07-07 21:38:48

标签: excel database vba database-connection ado

以下代码不适用于此存储过程。它适用于查询和另一个存储过程。

它不会debug.print这个存储过程的值,并返回错误“无法在对应于所请求的名称或序号的集合中找到项目”

Dim x As ADODB.Connection
Set x = New ADODB.Connection

x.ConnectionString = "Provider=a;Server=b;Database=c;Trusted_Connection=yes;"
x.Open

Dim y As ADODB.Recordset
Set y = New ADODB.Recordset
x.CommandTimeout = 0

Set y = x.Execute("exec SP_storedprocedure 0")
Debug.Print y(0), y(1), y(2), y(3)**--the problem is here**

y.Close
Set y = Nothing
x.Close
Set x = Nothing

3 个答案:

答案 0 :(得分:0)

确保存储过程包含在您正在访问数据库的用户的securables中。为此:

在安全的SSMS上 - >在用户下 - >右键单击您正在访问的用户 - >点击属性 - >单击Securables选项卡并查看列表并确保其中包含存储过程。如果没有,请点击"搜索"按钮 - >检查"特定对象"收音机 - >单击确定 - >点击"对象类型"新弹出窗口上的按钮 - >选中存储过程复选框 - >单击确定 - >确保列出了存储过程,然后单击“确定” - >现在它在securables下列出 - >在显式标签下查找" Excute"在权限列 - >找到一个有" dbo"在Grantor Column下,选中Grant复选框,然后单击OK。

这应该可以解决问题。

答案 1 :(得分:0)

确保您的数据集未被过滤。将数据集的过滤器设置为false然后关闭它,然后使用它。或者更好地使用干净的数据集。

答案 2 :(得分:0)

您的存储过程是否可以在其中进行调试选择?可能您正在选择某个变量的值作为调试语句。这会产生返回两个表的效果。除非另有说明,否则您的数据集将在第一个数据集中。

在SSMS中执行此操作并确保它返回您认为返回的内容。

exec SP_storedprocedure 0

另外,要解决问题,请制作4个debug.print语句并查看哪个(哪些)中断。

考虑到您对@MarkBalhoff关于列数为零的定义,另一种可能性是您只是忘记在查询结束时返回结果。你在建一个温度表吗?

你sp中的最后一个(或接近最后一个)语句应该是

select * from #temp

类似于计算函数中的正确值,然后忘记返回它。