【问题标题】:How to execute stored procedure from Access using linked tables如何使用链接表从 Access 执行存储过程
【发布时间】:2010-06-15 21:54:04
【问题描述】:

我有一个 Access 2003 数据库,它通过 ODBC 连接到 SQL Server 2008 机器。 SQL Server 中的表在 Access 中作为链接表连接。我在尝试通过 ADO 代码执行的 SQL Server 上有一个存储过程。我遇到的问题是 Access 似乎无法找到该过程。我必须在 Access 中做什么才能执行此存储过程?一些事实...

有问题的存储过程接受一个整数参数。存储过程返回一个记录集,我希望将其用作 ListBox 的数据源。

这是我在 Access 中的 ADO 代码 ...

Private Sub LoadUserCaseList(userID As Integer)

  Dim cmd As ADODB.Command

  Set cmd = New ADODB.Command
  cmd.ActiveConnection = CurrentProject.Connection
  cmd.CommandType = adCmdStoredProc
  cmd.CommandText = "uspGetUserCaseSummaryList"

  Dim par As New ADODB.Parameter
  Set par = cmd.CreateParameter("userID", adInteger)
  cmd.Parameters.Append par
  cmd.Parameters("userID") = userID

  Dim rs As ADODB.Recordset
  Set rs = cmd.Execute()
  lstUserCases.Recordset = rs

End Sub

我得到的错误是“microsoft jet 数据库引擎找不到输入表或查询“uspGetUserCaseSummaryList”。

【问题讨论】:

    标签: ms-access stored-procedures ado vba


    【解决方案1】:

    CurrentProject.Connection 是到您的 Access 数据库的连接。您可以通过在“立即”窗口中执行此操作来验证:

    Debug.Print CurrentProject.Connection
    

    您需要使用指向您的 SQL Server 实例的连接字符串创建一个新的 ADODB.Connection 对象。让您的 ADODB.Command 对象使用该连接。

    编辑:您可以消除 ADODB.Command 对象,并使用连接的 Execute 方法从存储过程中返回记录。此示例使用需要 3 个参数的存储过程。

    Private Sub GetCenterCodes()
        Dim cnn As ADODB.Connection
        Dim rs As ADODB.Recordset
    
        Set cnn = New ADODB.Connection
        cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=VM2003\sqlexpress;" _
            & "User ID=foo;Password=bar;Initial Catalog=Inventory"
        cnn.Open
        Set rs = New ADODB.Recordset
        Set rs = cnn.Execute("EXEC uspGetCenterCodes 14, 14, 501")
        Debug.Print rs(0), rs(1), rs(2)
        rs.Close
        Set rs = Nothing
        cnn.Close
        Set cnn = Nothing
    End Sub
    

    您可以在ConnectionStrings.com找到符合您需求的连接字符串示例

    【讨论】:

    • 优秀的答案!非常感谢。一个问题。您如何建议将连接字符串信息存储到 SQL Server,以便只需要在一个地方进行更改?我喜欢链接表的一件事是我有一个名为“刷新连接”的宏,它调用一个子例程来重置所有表的 ODBC 连接信息(在测试和生产环境之间切换)。如果我可以在不让用户进入代码的情况下对 ADO 连接信息做同样的事情,那就太好了。
    • 假设您将连接属性存储在一个表中,您可以为测试和生产连接属性创建单独的记录。让您的刷新连接宏将相应的记录标记为活动的。然后创建一个函数 GetConnectionString,它读取活动连接记录并构建您的连接字符串。那么上面的代码可以改成cnn.ConnectionString = GetConnectionString。顺便说一句,您可能更喜欢使用受信任的连接,这样您就可以避免处理用户 ID 和密码。
    • 再次感谢您。很好的解决方案。
    • 将整个连接字符串作为一个字段存储在连接表中可能更方便。然后您的 GetConnectionString 函数可以检索整个存储的字符串。
    • 我在想我可能有一个保存在 MDB 文件本地的表,并且在该表中我会有几个连接字符串。一个用于生产,一个用于测试,然后我将创建两个不同的宏,“连接到生产”和“连接到测试”。每个宏都会将适当的连接字符串标记为活动的,然后任何需要建立连接的代码都可以读取它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多