调用存储过程VBA

时间:2014-06-17 14:57:31

标签: sql-server vba ms-access stored-procedures access-vba

背景:我正在使用Microsoft SQL Server 2008后端在Access 2010用户前端中工作。访问中的表都链接到SQL Server数据库。我有一个存储过程,将新值(由参数提供)插入表中。我经历了很多例子,但我不明白是否真的很接近它或者我完全没有。我之前问了一个类似的问题并得到了一个好的anwser,但我有关于连接字符串的问题。这是问题/ anwser Calling Stored Procedure while passing parameters from Access Module in VBA

我不知道并且不知道如何找到建立连接字符串所需的信息(例如:我不知道提供者/服务器名称/服务器地址)。我在这里发现了一个问题:“如果你已经有一个指向SQL Server数据库的Access链接表,那么你可以简单地使用它的.Connect字符串和DAO.QueryDef对象来执行存储过程” - Connection string for Access to call SQL Server stored procedure我试图实现这个代码,但我不确定如何传递参数,所以我尝试使用前面的例子。但是我在“Set rst = qdf.OpenRecordset(dbOpenSnapshot)”这一行得到了错误“call failed”,更不用说我的传递参数代码可能是关闭的。

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  

有人能告诉我我的代码有什么问题以及我收到此错误的原因吗?谢谢!

2 个答案:

答案 0 :(得分:14)

维多利亚,

您可以使用ADO运行存储过程,如下所示......

Set mobjConn = New ADODB.Connection
mobjConn.Open "your connection string"
Set mobjCmd = New ADODB.Command
With mobjCmd
    .ActiveConnection = Me.Connection
    .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
在立即窗口中

,它应显示一个可以使用的连接字符串。

如果您有任何问题,请尝试并告诉我。

答案 1 :(得分:0)

还可以制定存储的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