4

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

4

1 回答 1

2

我认为问题正在发生,因为您将 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。

于 2012-12-13T08:56:37.163 回答