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

Sql 从JS ActiveX ADO在MS Access 2013中通过视图查询执行VBA函数,sql,ms-access,vba,activex,Sql,Ms Access,Vba,Activex,如何从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函数值的select语句 我想通过局域网(相同的域策略)从JS ActiveX ADO执行该视

如何从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函数值的select语句

我想通过局域网(相同的域策略)从JS ActiveX ADO执行该视图查询。查询抛出一个错误,表示我至少需要一个表或查询。我还注意到,如果我从一个不执行VBA函数的视图查询中读取数据,它就会顺利通过。这是设计的安全控制吗?有没有办法在这个设置中获取用户ID


谢谢大家!

您可能无法直接从查询中调用API函数,但如果您将其放在访问模块中,并创建一个返回字符串的函数,则该函数应该适用于您

您还没有发布任何其他代码或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对象的可能选项

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

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

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

在Access应用程序会话中,称为“expression service”的功能允许db引擎使用VBA用户定义的功能。因此,您的查询可以在Access会话中正常运行

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


而这种查询方法无法发挥作用。建议您探索@dbmitch提供的
WScript.Network
方法。

您的查询SQL是什么?它是否在MS Access中自行运行?嗨。这正是我所拥有的。如果我从JS中的ActiveX ADO连接运行此查询,则该查询不起作用。所有不涉及VBA函数的其他查询都可以从此连接运行可能会使用包含该信息的编辑更新您的问题。也许我应该这样做。谢谢。有没有关于如何解决这个问题的建议?我不知道-您是在动态构建SQL还是试图从MS Access数据库调用预构建的查询?你有JS代码可以共享吗?这个表达式服务可以从ActiveX对象获得吗?对这个问题有很好的背景解释。感谢您添加这一点,@geeko表达式服务是Access应用程序的一项功能。如果在Access会话中有ActiveX对象,则为“是”。否则不行。