如果不是交互式的,来自 Microsoft Access VBA 的 mySQL 查询会失败吗?

Posted

技术标签:

【中文标题】如果不是交互式的,来自 Microsoft Access VBA 的 mySQL 查询会失败吗?【英文标题】:mySQL-query from Microsoft Access VBA fails if not interactive? 【发布时间】:2012-12-09 15:38:29 【问题描述】:

我正在与一个真正困扰我的 VBA 非交互式问题作斗争:我有一个对 mysql 数据库的直通查询,如果用户双击它就可以很好地工作。但是如果从 VBA 自动化会话(从 excel 调用)调用,如果没有先进行交互,它会失败。最奇怪的是:它在 VBA 在 GUI 上单击它一段时间后工作(可能是 odbc mysql 连接超时)。

直通查询在 DSN 和连接字符串中有它的密码(以解决存储问题)。链接表的行为相同。

调用的有问题的 VBA 代码如下所示:

CurrentProject.Connection.Execute "INSERT INTO [SomeLocalTable] (id) SELECT id FROM [somePassThroughOrLinkedMySQLTable]"

错误是一般的 odbc 连接失败 80004005。

虽然这种类型的查询一直有效:

Dim cnn As New ADODB.Connection
cnn.Open ("Driver=MySQL ODBC 5.2w Driver;SERVER=myserver;UID=user;DATABASE=db;PORT=3306;DFLT_BIGINT_BIND_STR=1;PWD=secret")

我可以像 UI 那样“初始化”直通查询以使其工作吗?或者我可以使用第二种查询插入到本地 MS Access 表中吗?

环境:Win8-64bit,Office2013,mysql-odbc-5.2w

【问题讨论】:

嘿,我还没有找到这篇文章。即使我认为它不适用,因为凭据已经存储在连接字符串中,我会先尝试一下。敬请期待…… 不,无济于事:就像那里建议的那样,我执行了 'CurrentProject.Connection.Execute("SELECT * FROM [ODBC;DSN=vTiger;Driver=MySQL ODBC 5.2w Driver;SERVER=myserver; UID=table;DATABASE=db;PORT=3306;DFLT_BIGINT_BIND_STR=1;PWD=secret].mysqlTable WHERE FALSE")' - 如果(且仅当)没有与 GUI 建立连接,它会失败并出现相同的错误之前。 它与表名相同,这就是我将其与帖子混淆的原因 - 将其更改为“用户” 也欢迎大胆猜测 ;) 您能否使用相同的语句从 Access UI(而不是 VBA)创建和运行追加查询? 【参考方案1】:

我认为问题正在发生,因为您将 Access 数据库称为外部 ADODB 数据源,而我将使用 Access 的实例来通过 DAO 运行查询。下面的示例子创建了一个不可见的 Access 实例并执行查询,然后在完成后退出。在这个示例中,我在 DAO 版本 3.6 中使用了后期绑定,因此您可能需要稍微修改该部分或使用早期绑定:

Sub ExecPassThru()

Dim acApp As Object
Dim acDb As Object

    Set acApp = CreateObject("Access.Application")
    Set acDb = CreateObject("DAO.DBEngine.36") 'May need slight alteration
    acApp.OpenCurrentDatabase ("C:\db1.mdb") 'Amend as required

    Set acDb = acApp.CurrentDb

    acDb.Execute "INSERT INTO [SomeLocalTable] (id) SELECT id FROM [somePassThroughOrLinkedMySQLTable]"

    acDb.Close
    acApp.Quit 2

End Sub

这是使用 Excel 2003 编码的,但应该很容易转换到更高版本的 office。

【讨论】:

这就是我已经在 Excel 中所做的事情。但是这个问题可以通过 Access 本身重现。只需执行 VBA 代码 'CurrentProject.Connection.Execute("SELECT * FROM [ODBC;DSN=vTiger;Driver=MySQL ODBC 5.2w Driver;SERVER=myserver;UID=table;DATABASE=db;PORT=3306;DFLT_BIGINT_BIND_STR =1;‌​PWD=secret].mysqlTable WHERE FALSE")' 在 Access 中显示相同的行为。 @Christian CurrentProject.Connection 仍然使用 ADODB 字符串而不是 DAO,这就是我建议这种方法的原因。如果您使用 CurrentDb.Execute 而不是 CurrentProject.Connection.Execute 在访问中,您仍然会收到错误吗? CurrentDb.Execute 打印另一条错误消息:运行时错误 3065:无法执行选择查询(翻译自德语)。但是:OpenRecordset 有效!所以使用 DAO 而不是 ADODB 似乎是解决方案。而且用一次就够了,之后我可以继续使用ADODB。这是 Access 中的一个真正的错误,不是吗?非常感谢您解决这个问题! @Christian 我认为这是一个 Insert Into 而不是 Select 查询,对于 Selects 可以不被执行。注意:除非您只想要没有 UDF 或其他交互等的基本 Access 查询,否则 ADODB 是可以的,但对于 Access DAO 中涉及更多的过程是一个更安全的选择。正如您所说,一旦完成这一点,您就可以使用 ADODB 继续其余的工作,很高兴为您提供帮助:)

以上是关于如果不是交互式的,来自 Microsoft Access VBA 的 mySQL 查询会失败吗?的主要内容,如果未能解决你的问题,请参考以下文章

用户可以直接在 Microsoft Vista 上与服务交互吗?

如何授权 .NET 5.0 / C# 应用程序在没有用户交互的情况下与 Microsoft 365 SharePoint Online 交互?

UIPickerView 不是交互式的

python import 以交互方式工作,但不是来自脚本

加入多个表后如何处理空值

在“打开方式”菜单中显示应用程序……如果是来自 Microsoft 应用程序的文件附件