在集合中找不到与请求的名称或序数相对应的项目

问题描述 投票:0回答:3

下面的代码不适用于该存储过程。它适用于查询和另一个存储过程。

它不会调试.打印此存储过程的值,并返回错误“在与请求的名称或序号相对应的集合中找不到项目”

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
excel database vba database-connection ado
3个回答
0
投票

确保存储过程包含在您访问数据库的用户的安全对象中。为此:

在 SSMS 上的安全性下 --> 在用户下 --> 右键单击您正在访问的用户 --> 单击属性 --> 单击“安全”选项卡并查看列表并确保其中包含存储过程。如果没有,单击“搜索”按钮 --> 选中“特定对象”单选 --> 单击“确定”-> 单击新弹出窗口上的“对象类型”按钮 --> 选中“存储过程”复选框 --> 单击“确定”-> 创建确保存储过程已列出,然后单击确定 --> 现在,在它列在安全项下后 --> 在“显式”选项卡下,在“权限”列中查找“执行”--> 在“授予者”列下找到具有“dbo”的那个,然后检查授予复选框并单击“确定”。

这应该可以解决问题。


0
投票

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


0
投票

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

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

exec SP_storedprocedure 0

此外,要解决问题,请创建 4 个 debug.print 语句并查看哪一个出现问题。

考虑到您对 @MarkBalhoff 关于列数为零的声明,另一种可能性是您只是忘记在查询结束时返回结果。您正在构建临时表吗?

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

select * from #temp

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

© www.soinside.com 2019 - 2024. All rights reserved.