Сбой открытого набора записей ADODB / «Операция не разрешена, когда объект закрыт» - PullRequest
8 голосов
/ 05 октября 2011

У меня есть следующий UDF в Excel, который использует ADO для подключения к моему серверу MSSQL.Там он должен выполнить скаляр udf "D100601RVDATABearingAllow".

По какой-то причине параметры, которые я пытаюсь добавить, не отправляются на сервер sql.Только на сервере:

SELECT dbo.D100601RVDATABearingAllow

.

МОЙ EXCEL UDF:

   Function RVDATA(Fastener) As Long

    Dim cnt As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim Cmd1 As ADODB.Command
    Dim stSQL As String

Const stADO As String = "Provider=SQLOLEDB.1;Data ................"
'----------------------------------------------------------
Set cnt = New ADODB.Connection
 With cnt
    .ConnectionTimeout = 3
    .CursorLocation = adUseClient
    .Open stADO
    .CommandTimeout = 3
 End With
'----------------------------------------------------------
Set Cmd1 = New ADODB.Command
    Cmd1.ActiveConnection = cnt
    Cmd1.CommandText = "dbo.D100601RVDATABearingAllow"
    Cmd1.CommandType = adCmdStoredProc
'----------------------------------------------------------
Set Param1 = Cmd1.CreateParameter("Fastener", adInteger, adParamInput, 5)
Param1.Value = Fastener
Cmd1.Parameters.Append Param1
Set Param1 = Nothing
'----------------------------------------------------------
Set rst = Cmd1.Execute()
RVDATA = rst.Fields(0).Value    
'----------------------------------------------------------
    rst.Close
    cnt.Close
    Set rst = Nothing
    Set cnt = Nothing
'----------------------------------------------------------
End Function

Когда я использую adCmdStoredProc, все происходит не так, и в отладчике vba свойствав наборе записей много " Операция не разрешена, когда объект закрыт " (может звучать немного иначе, сообщение переведено)

Когда я надеваюне использую adCmdStoredProc Я получаю сообщение о том, что переменная Крепеж был не предоставлен .

Я думаю, что возможночто-то не так в том, как я открываю набор записей.В других шагах я читал об использовании опции «SET NOCOUNT ON», но это тоже не сработало.

У кого-нибудь есть идея?С уважением Lumpi

Ответы [ 5 ]

16 голосов
/ 08 марта 2013

Также столкнулся с этой ошибкой (в моем случае я использую хранимую процедуру для получения некоторой информации). Я внес некоторые изменения, которые привели к сбоям в исполнении.

Ошибка исчезла, когда я установил SET NOCOUNT ON в качестве первого оператора хранимой процедуры.

1 голос
/ 19 октября 2016

Другая возможная причина этого - операторы отладки.Я просто потратил слишком много времени, пытаясь понять, почему это не сработало для меня, Proc в базе данных работал нормально, данные, которые он должен был вставить, были вставлены, код VBA работал нормально, но в наборе записей ничего не было,Окончательное решение состояло в том, чтобы просмотреть созданные пробы и удалить операторы PRINT.Чтобы проверить, является ли это проблемой, запустите ваш proc на SQL Server вручную, а затем посмотрите на вкладку сообщений с результатами, если есть что-то, кроме «Команда (ы) выполнена успешно».Вы должны устранить эти сообщения.«SET NOCOUNT ON» избавит от сообщений о количестве строк, но могут быть и другие.

Я предполагаю, что через 5 лет OP решит эту конкретную проблему, так что это только для любого, как якоторый находит это при поиске той же проблемы.

1 голос
/ 06 октября 2011

Вам не нужно SELECT функция на стороне сервера, просто укажите ее имя ("[tra-CAE400-1] .dbo.D100601RVDATABearingAllow") в свойстве .CommandText.Также вы должны установить для свойства .CommandType значение «хранимой процедуры» ( ссылка на свойство на w3schools.com ).

Тогда adodb узнает, что вы говорите о вызове функции, ине пытается отправить простую sql-команду.

Скорее всего, она позволит вам определить параметры объекта команды.Но параметры, которые вы определяете в объекте команды, должны точно соответствовать (по имени и типу) тем параметрам, которые определены как аргументы функции на сервере sql.

Пример с сайта microsoft.comоб использовании объекта команды с хранимой процедурой

ADO Ссылка на microsoft.com

0 голосов
/ 05 января 2017

В нашем магазине мы часто используем подобные строки в наших хранимых процедурах, чтобы помочь с отладкой:

RAISERROR('Debug message here',0,1) WITH NOWAIT;

Это также нарушает открытие набора записей в Excel vba.Я считаю, что полный ответ на этот вопрос в хранимой процедуре:

  1. использовать SET ROWCOUNT OFF
  2. удалить все операторы PRINT
  3. удалить все операторы RAISEERROR, используемые дляотладка (то есть серьезность 0)
0 голосов
/ 03 сентября 2014

Я тоже столкнулся с этим с помощью хранимой процедуры. Вы установили NOCOUNT = OFF; внизу вашего кода? Это то, что сработало для меня после долгих поисков. Кроме того, если у вас есть какой-либо другой код, который выполняется, вы должны заключить его в Nocount = on / off, ВКЛЮЧАЯ операторы вставки и обновления. Вы могли бы подумать, что оператор вставки не имеет значения, но обертывание кода таким образом удерживает меня от самоубийства сегодня.

...