【问题标题】:Calling stored procedure using VBA使用 VBA 调用存储过程
【发布时间】:2014-08-07 15:48:36
【问题描述】:

我正在使用 Access 2010 用户前端和 Microsoft SQL Server 2008 后端。

Access 中的表都链接到 SQL server 数据库。

我有一个将新值(由参数提供)插入到表中的存储过程。

我之前问过类似的问题,得到了很好的回答Calling Stored Procedure while passing parameters from Access Module in VBA

我不知道如何找到创建连接字符串所需的信息(例如:我不知道提供者/服务器名称/服务器地址)。

我在这里发现了一个问题,上面写着“如果您已经有一个指向 SQL Server 数据库的 Access 链接表,那么您可以简单地将其 .Connect 字符串与 DAO.QueryDef 对象一起使用来执行存储过程”-@ 987654322@

我尝试实现此代码。为了传递参数,我尝试使用前面的示例。

我收到了错误

调用失败

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

谁能告诉我我的代码有什么问题以及为什么会出现这个错误?

【问题讨论】:

  • 这是标准的 Access 数据库还是 Access 数据项目?即表是通过 ODBC(标准数据库)链接的,还是您将数据项目直接连接到 SQL Server 数据库?
  • 我不确定我没有创建数据库,我只是为它编写程序。有没有办法告诉?
  • 不确定 Access 2010,但要看的东西...表是链接表还是它们看起来像本机表?在“文件”菜单选项下,您是否有设置与数据库连接的“连接”选项?
  • 这些表是链接表,文件菜单中没有连接选项,但是有一个模块可以控制前端连接到的数据库。数据库存储在服务器上。我不知道这是否有帮助。
  • 没关系。我去看看,给你想办法。

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


【解决方案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

在即时窗口中,应该会显示一个您可以使用的连接字符串。

你可以试试,如果你有任何问题,请告诉我。

【讨论】:

  • 连接字符串可能需要不同,因为 CurrentDB.TableDef 对象默认使用 DAO,而此连接使用 ADO。 connectionstrings.com 是一个非常有用的资源,可用于找出必要的更改。
  • 是的!这让它工作谢谢你的帮助!
  • Me.Connection 是什么?它抛出错误invalid use of Me keyword
【解决方案2】:

还可以制定将结果集作为选择语句返回的存储过程调用。

按照这个例子:

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

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2016-10-19
    • 2018-07-18
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多