【问题标题】:Execute VBA Function via View Query in MS Access 2013 from JS ActiveX ADO从 JS ActiveX ADO 通过 MS Access 2013 中的视图查询执行 VBA 功能
【发布时间】:2018-07-27 01:22:47
【问题描述】:

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

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

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

视图查询是一个返回 VBA 函数值的选择语句。

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

谢谢!

【问题讨论】:

  • 你的查询 SQL 是什么?它是否在 MS-Access 中自行运行?

标签: sql ms-access vba activex


【解决方案1】:

在 Access 应用程序会话中,称为“表达式服务”的功能允许 db 引擎使用您的 VBA 用户定义函数。因此,您的查询在 Access 会话中运行良好。

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

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

【讨论】:

  • 此表达式服务是否可从 ActiveX 对象获得?
  • 对问题的良好背景说明。感谢您添加,
  • @geeko 表达式服务是 Access 应用程序的一项功能。如果您在 Access 会话中有一个 ActiveX 对象,那么可以。否则没有。
【解决方案2】:

您可能无法直接从查询中调用 API 函数,但如果您将它放在 Access 模块中,并创建一个返回字符串的函数,它应该可以为您工作。

您还没有发布任何其他代码或 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);

【讨论】:

  • 嗨。这正是我所拥有的。如果我从 JS 中的 ActiveX ADO 连接运行此查询,它不起作用。
  • 所有其他不涉及 VBA 函数的查询都通过此连接工作
  • 也许可以通过包含该信息的编辑来更新您的问题。
  • 也许我应该。谢谢。关于如何解决这个问题的任何建议?
  • 我不知道 - 您是即时构建 SQL 还是尝试从 MS-Access 数据库调用预构建查询?有 JS 代码可以分享吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多