Вызов хранимой процедуры VBA

Справочная информация. Я работаю в интерфейсе пользователя Access 2010 с бэкэнд Microsoft SQL Server 2008. Таблицы в доступе связаны с базой данных SQL-сервера. У меня есть хранимая процедура, которая вставляет новые значения (поставляемые параметрами) в таблицу. Я прошел через множество примеров, но я не понимаю достаточно, чтобы узнать, действительно ли я близок к тому, чтобы получить его, или я полностью отключен. Ранее я задал аналогичный вопрос и получил хороший андерсерс, но у меня проблемы с строкой соединения. Вот вопрос /anwser Вызов хранимой процедуры при передаче параметров из модуля доступа в VBA

Я не знаю и не знаю, как найти информацию, необходимую для создания строки подключения (например: я не знаю адрес сервера/сервера/сервера). Я нашел здесь вопрос: "Если у вас уже есть связанная с Access таблица, указывающая на базу данных SQL Server, вы можете просто использовать ее строку .Connect с объектом DAO.QueryDef для выполнения хранимой процедуры" - Строка подключения для доступа к вызову хранимой процедуры SQL Server Я попытался реализовать этот код, но я не знал, как передавать параметры, поэтому я попытался использовать предыдущий пример. Но я получил ошибку "call failed" в строке "Set rst = qdf.OpenRecordset(dbOpenSnapshot)", не говоря уже о том, что мой код передаваемых параметров, вероятно, вышел из строя.

Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = CurrentDb.TableDefs("tblInstrumentInterfaceLog").Connect
qdf.sql = "EXEC dbo.upInsertToInstrumentInterfaceLog"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)

qdf.Parameters.Append qdf.CreateParameter("@BatchID", adVarChar, adParamInput, 60, BatchID)
qdf.Parameters.Append qdf.CreateParameter("@InstrumentName", adVarChar, adParamInput, 60, InstrumentName)
qdf.Parameters.Append qdf.CreateParameter("@FileName", adVarChar, adParamInput, 60, FileName)
qdf.Parameters.Append qdf.CreateParameter("@QueueId", adVarChar, adParamInput, 60, QuenueId)

rst.Close
Set rst = Nothing
Set qdf = Nothing  

Может ли кто-нибудь сказать мне, что может быть неправильно с моим кодом и почему я получаю эту ошибку? Спасибо!

Ответ 1

Виктория,

Вы можете запустить хранимую процедуру, используя ADO, как показано ниже...

Set mobjConn = New ADODB.Connection
mobjConn.Open "your connection string"
Set mobjCmd = New ADODB.Command
With mobjCmd
    .ActiveConnection = mobjConn 
    .CommandText = "your stored procedure"
    .CommandType = adCmdStoredProc
    .CommandTimeout = 0
    .Parameters.Append .CreateParameter("your parameter name", adInteger, adParamInput, , your parameter value)
    ' repeat as many times as you have parameters

    .Execute
End With

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

Debug.Print CurrentDb.TableDefs("tblInstrumentInterfaceLog").Connect

в Immediate Window, и там должна быть строка подключения, которую вы можете использовать.

Не могли бы вы попробовать и дайте мне знать, если у вас есть какие-либо проблемы.

ясень

Ответ 2

Можно также сформулировать хранимый вызов proc, который возвращает набор результатов в виде оператора выбора.

Согласно этому примеру:

Sub Macro2()


'
' Macro1 Macro
'
    'Declare variables'
        Dim mySql As String
        Set objMyConn = New ADODB.Connection
        objMyConn.CommandTimeout = 0
        Set objMyCmd = New ADODB.Command
        objMyCmd.CommandTimeout = 0
        Set objMyRecordset = New ADODB.Recordset
        objMyConn.ConnectionString = CStr(Range("ADOConnectString").Value)
        objMyConn.Open
        Set objMyRecordset.ActiveConnection = objMyConn
        Set objMyCmd.ActiveConnection = objMyConn


   ' call dbo.TotalLHCLoadingRate  Range("TotalLHCLoadingRate")

        mySql = "select dbo.TotalLHCLoadingRate ( " _
    + CStr(Range("MemberNo").Value) _
    + ", getdate() ) "
        MsgBox "TotalLHCLoadingRate SQL : " + mySql
        objMyCmd.CommandText = mySql
        objMyCmd.CommandType = adCmdText
        objMyCmd.Execute
        objMyRecordset.Open objMyCmd
        Range("TotalLHCLoadingRate ").Value = ""
        Range("TotalLHCLoadingRate ").CopyFromRecordset (objMyRecordset)
        Range("TotalLHCLoadingRate ").Interior.ColorIndex = 37
        MsgBox "TotalLHCLoadingRate  : " + CStr(Range("TotalLHCLoadingRate ").Value)
        objMyRecordset.Close
End Sub