Я хочу прочитать вывод хранимой процедуры как набор записей в подпрограмме 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')}