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