首页 > 解决方案 > Cmd.Parameters.Refresh 不再检索任何参数

问题描述

从今天开始,我在尝试从 VBA Excel 在 SQL Server 2008 上执行存储过程时遇到以下错误。

运行时错误“3265”:在与请求的名称或序号对应的集合中找不到项目。

我发现发生此错误是因为该Cmd.Parameters.Refresh命令不返回任何值。这在打印参数计数时变得可见(https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/count-property-ado?view=sql-server-2017)。

在 SQL Server 中运行存储过程EXEC不会产生任何问题。为了完整起见,我在下面添加了 SQL 代码。

奇怪的是,另一个(旧)Excel 文件中的完全相同的代码确实可以很好地工作。

您可以在下面找到 VBA 代码和 SQL Alter/Create 过程代码。

VBA

Option Explicit

Global Const Conn_999 As String = "Provider=SQLOLEDB; Data Source=SERVER999; Initial Catalog=AA; Trusted_connection=yes"

Sub ReadAllFromdb()    
    ' -- Unprotect sheets  --        
    Sheets("Ind").Unprotect

    ' Get Id    
    Dim Id As Long
    Id = Cells(3, 2)

    ' -- Create connection --    
    Dim Conn As New ADODB.Connection
    Dim Cmd As New ADODB.Command

    ' -- Connect to database (see Connection settings for details) --        
    Conn.Open Conn_999

    ' -- Bind ADODB connection to command  --    
    Cmd.ActiveConnection = Conn

    ' -- Identify command type as stored procedure (all command types)  --    
    Cmd.CommandType = adCmdStoredProc

    ' -- Set the name of the stored procedure (CommandText property) --    
    Cmd.CommandText = "OS.dbo.usp_GetId"

    ' -- Retrieve parameter information for the stored procedure  --    
    Cmd.Parameters.Refresh

    ' Retreive parameter count for debugging (return zero)    
    Debug.Print(Cmd.Parameters.Count) ' Prints 0

    Cmd.Parameters("@Id").Value = 888 ' ---------> ERROR <---------

    Set RS = Cmd.Execute(RecordsAffected:=RecordsAffected)    
    ...    
End Sub

SQL 服务器

USE [OS]
GO
/****** Object:  StoredProcedure [dbo].[usp_GetName]    Script Date: 5/6/2019 1:37:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET NOCOUNT ON
GO

/****** Script for SelectTopNRows command from SSMS  ******/
ALTER PROCEDURE [dbo].[usp_GetName]
    @Id INT
AS
    SELECT [Name]
    FROM [OS].[dbo].[All]
    WHERE Id = @Id

    RETURN

任何帮助找到此错误的真正来源都将非常受欢迎。

编辑(2019-05-09):

显然,该错误是由于将OS.dbo.存储过程名称放在前面引起的。这意味着,我必须为不同数据库上的每个查询创建一个新的连接字符串和连接,但它解决了这个问题。

标签: sql-serverexcelvbaoledb

解决方案


推荐阅读