Cmd.Parameters.Refresh不再检索任何参数

时间:2019-05-06 12:55:27

标签: sql-server excel vba oledb

从今天开始,当我尝试从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)时,这是可见的。

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

奇怪的是,另一个(旧)Excel文件中的代码完全相同,却可以正常工作。

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

VBA

Option Explicit

Global Const Conn_396 As String = "Provider=SQLOLEDB; Data Source=BEGENTN396\sql1; Initial Catalog=OS; Trusted_connection=yes"

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

    ' Get PickerId    
    Dim PickerId As Long
    PickerId = 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_396

    ' -- 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_GetPickerName"

    ' -- 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("@PickerId").Value = 888 ' ---------> ERROR <---------

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

SQL Server

USE [OS]
GO
/****** Object:  StoredProcedure [dbo].[usp_GetPickerName]    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_GetPickerName]
    @PickerId INT
AS
    SELECT [PickerName]
    FROM [OS].[dbo].[All]
    WHERE Pickernumber = @PickerId

    RETURN

任何寻求此错误真正原因的帮助都将受到欢迎。

编辑(2019-05-09):

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

0 个答案:

没有答案