【问题标题】:Running VBS script from VBA - Unrecognized DB Format从 VBA 运行 VBS 脚本 - 无法识别的数据库格式
【发布时间】:2019-10-11 12:52:58
【问题描述】:

我正在创建 vbs 脚本,它将作为使用 MS Access 作为前端的工具的自动更新程序。 VBS 脚本将使用 MS Access (1) 中的 VBA 代码启动。该脚本的一部分是通过创建与工具前端文件 (Test.accdb) 的 ADODB 连接并从“tblLocalParameters”表 (2) 中读取“CurrentVersion”值来检测工具当前版本的函数。

问题是,当我双击脚本时,使用 ADODB 的函数可以正常工作,但是当我尝试使用 MS Access VBA 运行它时,它会抛出错误: "无法识别的数据库格式"

我不确定是否需要有关整个自动更新程序脚本的更多信息,但我的计划是:检查 SQL db 是否工具是最新的。如果不是 - 启动更新程序脚本。脚本将使用 shell 命令关闭 MS Access,然后复制新文件并再次运行 MS Access。

我尝试从 excel 和其他 MS Access 文件运行相同的脚本,它导致了同样的错误。

对于摆脱“无法识别的数据库格式”错误的帮助,我将不胜感激。

MS ACCESS CODE:
(1) 
Dim Test()
    Shell "wscript ""C:\Test_Folder\TEST.vbs""", vbNormalFocus
End Sub
(2)
VBS SCRIPT CODE
Option Explicit

Dim strFile

strFile = "C:\Test_Folder\TEST.accdb"

WScript.Echo  FileReadAccessDB(strFile,"tblLocalParameters","ParameterValue","ParameterName","'VersionCurrent'")

'-------------------------------------------------------------
Function FileReadAccessDB(DbPath, tblName,fldName,IdCol,IdVal)
    Dim cn, rs
    Dim qSQL
    Dim errNo

    Set cn = CreateObject("ADODB.connection") 

    cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DbPath & ";Persist Security Info=False;"
    cn.Open

    Set rs = CreateObject("ADODB.recordset")
    qSQL = "SELECT " & fldName & " FROM " & tblName & " WHERE " & IdCol &  " = " & IdVal
    rs.open qSQL, cn

    FileReadAccessDB =  rs.fields(fldName).value

    rs.close
    cn.close

End Function

【问题讨论】:

  • 首先使用更新的提供程序(我认为 Access 2016 附带 ACE.OLEDB.16.0)。在共享模式下使用数据库通常很困难。但是,我建议将此类参数存储在数据库属性表中,这样您就可以正确存储正确的类型,而无需为每种类型都创建一个单独的表。
  • 你能解释一下为什么你不能在你的 VBA 代码中运行 VBS 代码吗?另外,您能解释一下错误发生在 VBS 中的哪个位置(哪一行)?
  • 问题行:cn.Open。为什么不在您的 VBA 代码中运行 VBS 代码:每个用户在文档文件夹下都有自己的 MS Access 工具文件,并在桌面上拥有它的快捷方式。我想控制人们正在使用的版本。根据我的经验,要求好心的用户删除旧版本的工具并复制新的工具是个坏主意。如果需要更新,用户将弹出并带有标签“立即更新”的按钮。这就是我需要一个 VBS 脚本的地方 - 想法是从 MS Access 运行这个脚本,脚本将关闭它,替换文件并再次打开。我无法替换正在使用的文件。
  • 我只是不明白为什么当我双击运行 VBS 脚本时它工作正常,但当我在 Excel/Access vba 编辑器中使用 shell 命令打开它时却不行。
  • 您正试图从该数据库文件中访问该数据库文件,有什么要理解的?这就是为什么只有 VBScript 可以工作的原因,因为您还没有在 MSAccess 中打开数据库。

标签: vba vbscript adodb ms-access-2016


【解决方案1】:

我找到了问题的根源。我决定放弃 VBS 并创建 C# 控制台应用程序。在测试过程中,我发现连接字符串 (provider = "Microsoft.ACE.OLEDB.12.0") 仅在我将平台目标设置为 x64 时才有效。

我的 Windows 是 64 位,但 Office 是 32 位。在资源管理器中双击以 x64 启动脚本,但 MS Access vba shell 以 x86 启动它。

我找到了一些代码,将其添加到脚本中 - 它解决了问题。

If InStr(LCase(WScript.FullName),"syswow64") Then
CreateObject("WScript.Shell").Run """%systemroot%\sysnative\wscript.exe"" """ & WScript.ScriptFullName & """"
  WScript.Quit
End If

如果脚本在 64 位窗口上以 32 位模式运行,它会在 64 位模式下重新运行。

Credit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多