从 JS ActiveX ADO 在 MS Access 2013 中通过视图查询执行 VBA 函数

Execute VBA Function via View Query in MS Access 2013 from JS ActiveX ADO

如何通过 MS Access 2013 中的视图查询从 JS ActiveX ADO 执行 VBA 宏?

VBA函数是获取当前登录用户使用:

Public Declare Function GetUser Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

视图查询是 select 语句 return VBA 函数值。

我想通过 LAN(同一域策略)从 JS ActiveX ADO 执行该视图查询。查询抛出一个错误,指出我至少需要一个 table 或查询。我还注意到,如果我从不执行 VBA 函数的视图查询中读取,它会毫无问题地通过。这是设计的安全控制吗?有什么方法可以在此设置中获取用户 ID?

谢谢!

您可能无法直接从查询中调用 API 函数,但是如果您将它放在 Access 模块中,并创建一个 returns 字符串的函数,它应该适合您.

您还没有发布任何其他代码或 SQL 所以我不确定您是否已经尝试过。

这是我在与您正在使用的相同 API 子查询中使用的内容

Public Function NetworkUserName() As String
    Dim strBuffer As String * 255
    Dim lngBufferLength As Long
    Dim lngRet As Long
    Dim strTemp As String

    lngBufferLength = 255
    lngRet = GetUSer(strBuffer, lngBufferLength)
    NetworkUserName = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1)
End Function

那么你的查询就像

SELECT NetworkUsername AS CurrentUser

编辑 - 添加可能的选项以在 JScript

中使用 ActiveX 对象

您可以尝试使用 Wscript.Shell ActiveX 对象和 ExpandEnvironmentStrings 方法提取环境变量 %USERNAME%,而不是使用 ADODB 调用。

但您可能正在寻找网络用户名 - 也许这在 JScript 中就足够了

var winNet = new ActiveXObject("WScript.Network");
alert(winNet.UserName);

在 Access 应用程序会话中,称为 "expression service" 的功能允许数据库引擎使用您的 VBA 用户定义函数。因此,您的查询 运行 在 Access 会话中没问题。

但是,当您尝试通过 JavaScript 运行 相同的查询时,它不会在 Access 应用程序会话中执行...因此表达式服务不可用以允许数据库引擎使用您的 UDF。因此查询尝试失败。

并且无法使该查询方法起作用。建议您探索@dbmitch 提供的 WScript.Network 方法。