【问题标题】:How to use MS Access Public Function from VB6如何在 VB6 中使用 MS Access 公共功能
【发布时间】:2012-10-26 08:59:09
【问题描述】:

我有一个 MS Access 数据库,它在 VBA 中定义了一个公共函数,存储在 Module1 中。我想将该函数作为查询的一部分包含在内,该查询通过 ADODB.RecordSet 的 Open 方法从 VB6 传递给 ADODB。

VBA 函数称为 IsOpcodePresent,它采用查询中提供的两个参数。

查询(缩写)是

SELECT * FROM tbl WHERE IsOpcodePresent(example,syl) order by syl;

这可以吗?如果我使用像 IsNull 这样的标准 Access 函数,那么它就可以工作。但对于我自己的函数,它不会。

【问题讨论】:

  • IsOpcodePresent 返回什么?
  • 您不能在 Access 实例之外使用 UDF(函数)。

标签: sql vba ms-access vb6


【解决方案1】:

恐怕这是不可能的。您需要一个 MS Access 实例。

MS Access“数据库”有两个部分。表单、报告和代码保存在 MS Access 中,数据通常保存在 Jet/ACE 数据库中。您的 ADODB 查询引用了 Jet/ACE 数据库,它与“前端”没有连接。当您在 MS Access 中运行查询时,它会引用代码。

根据功能,如果您使用 Access 2010 或更高版本,可能会重写为 Data Macro。它们甚至可以在 MS Access 之外运行,因为它们与 ACE 数据库相关联。

【讨论】:

  • 好的,如果我创建一个 Access.Application 的实例,然后呢?
  • 我一定没有正确解释。使用用户定义函数或 Access 函数的查询不会在 MS Access 之外运行。如果你创建了一个 Access 的实例,你可以在 Access 中运行查询,而不是,我想,你想要的。
【解决方案2】:
Function GetAccessRecordset(sDatabase As String, sSQL As String) As Variant
    Dim oAccess As Object
    Set oAccess = CreateObject("Access.Application")
    oAccess.OpenCurrentDatabase (sDatabase)
    oAccess.Visible = False
    Dim dbs As Object
    Set dbs = oAccess.CurrentDb.OpenRecordSet(sSQL)
    GetAccessRecordset = dbs.GetRows(dbs.RecordCount)
    dbs.Close
    oAccess.Quit
End Function

这就是我想要的。只要没有脚本阻塞或脚本已签名并且数据库接受签名,它就可以正常工作。它为我提供了二维结果数组,让我可以使用基于脚本的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多