Cmd.Parameters.Refresh не получает никаких параметров (больше) - PullRequest
0 голосов
/ 06 мая 2019

С сегодняшнего дня я сталкиваюсь со следующей ошибкой при попытке выполнить хранимую процедуру в SQL Server 2008 из VBA Excel.

Ошибка времени выполнения '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.

* 1019 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. перед именем хранимой процедуры. Это означало, что мне нужно было создать новую строку соединения и соединение для каждого запроса в другой базе данных, но это решило проблему.

...