Почему я получаю ошибку времени выполнения 3704 при чтении набора записей, созданного из вызова команды хранимой процедуры SQL-сервера - PullRequest
0 голосов
/ 21 мая 2019

Я хочу прочитать вывод хранимой процедуры как набор записей в подпрограмме MS Access. Я проверил хранимую процедуру на сервере SQL, и она отлично работает. Я могу установить соединение ADODB с базой данных, содержащей хранимую процедуру, и, внешне, кажется, что может установить и выполнить команду. Однако первая попытка доступа к набору записей приводит к ошибке 3704 во время выполнения - «Операция не разрешена, когда объект закрыт».

Это первый раз, когда я пытался что-то подобное. Есть ли шаг, который я пропустил? Что еще может вызвать эту ошибку?

Я проверял, что соединение ADODB открывается нормально.

Я пытался использовать метод .CommandText, чтобы перепроверить, что я правильно установил вызов команды, но в возвращаемой строке вместо этих двух параметров вместо имени хранятся только имя сохраненного процесса и вопросительные знаки. не помогает.

Option Compare Database
Option Explicit

Private Sub Process_Click()

    Dim ConnectString As String
    Dim MyConnection As ADODB.Connection
    Dim ProcedureCall As ADODB.Command
    Dim Param1 As ADODB.Parameter
    Dim Param2 As ADODB.Parameter
    Dim CodeListing As ADODB.Recordset
    Dim StrSproc As String

    ConnectString = "Provider=SQLOLEDB;Data Source={my SQL server name};Initial Catalog=BE;Integrated Security=SSPI;"

    Set MyConnection = New ADODB.Connection
    With MyConnection
        .CommandTimeout = 900
        .ConnectionString = ConnectString
        .Open
    End With

    Set ProcedureCall = New ADODB.Command
    Set Param1 = ProcedureCall.CreateParameter("@Database", adVarChar, adParamInput, 256, "BE")
    Set Param2 = ProcedureCall.CreateParameter("@ObjectName", adVarChar, adParamInput, 256, "pr_AM_ReletDetails")
    With ProcedureCall
        .ActiveConnection = MyConnection
        .CommandType = adCmdStoredProc
        .CommandText = "BE.dbo.pr_BI_ListObjectCode"
        .Parameters.Append Param1
        .Parameters.Append Param2
    End With

    MsgBox ProcedureCall.CommandText

    Set CodeListing = New ADODB.Recordset
    With CodeListing
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .LockType = adLockReadOnly
    End With

    Set CodeListing = ProcedureCall.Execute

    If CodeListing Is Nothing Then
        MsgBox "Not worked"
    Else
        CodeListing.MoveFirst
        MsgBox CodeListing!Line
        CodeListing.Close
    End If

    MyConnection.Close

End Sub

Кажется, что все шаги по открытию набора записей работают нормально, вплоть до строки CodeListing.MoveFirst, в которой и происходит сбой.

На сервере я могу выполнить процесс следующим образом, и все нормально:

EXEC BE.dbo.pr_BI_ListObjectCode @Database = 'BE', @ObjectName = 'pr_AM_ReletDetails'

Вывод свойства CommandText команды выглядит следующим образом:

{call BE.dbo.pr_BI_ListObjectCode (?,?)}

Я не знаю, как это должно выглядеть, или это означает, что параметры не сформированы или не присоединены должным образом, как я ожидал бы, что это будет выглядеть, как только будет полностью подготовлено:

{call BE.dbo.pr_BI_ListObjectCode (@Database = 'BE', @ObjectName = 'pr_AM_ReletDetails')}

...