2

我已经(几乎)尝试了一切来隔离问题,但我迷路了。

我有一个使用 ADODB 连接到本地 MySQL 数据库的 MS Access 应用程序。我将它复制到一台新计算机上,但现在存储过程的输出参数每次都包含一个随机值(如果通过 ADODB 完成)。在 MySQL WorkBench 中执行时,输出参数正确。

以下是两台电脑的规格:

  1. :Windows 7 Pro、Office 2010 ProPlus、MySQL ODBC 5.3.4、MySQL server 5.6.22(都是64位;也安装了32位ODBC);
  2. :Windows 10 Pro、Office 2016 ProPlus、MySQL ODBC 5.3.6、MySQL server 5.7.16(均为 64 位,MS Office 除外;还安装了 32 位 ODBC)。

为了隔离问题,我使用了以下简单的存储过程:

CREATE PROCEDURE `testit`(
    OUT iTest INT(11))
BEGIN
    SET iTest = 123;
END

一个测试 MS Access 数据库仅包含以下 VBA 代码(以及对 Microsoft ActiveX Data Objects 6.1 库的引用):

Public Function dbTestIt() As Long

Dim dbConn As ADODB.Connection
Dim dbCmd As ADODB.Command

    'Open new connection
    Set dbConn = New ADODB.Connection
    dbConn.ConnectionString = "Driver={MySQL ODBC 5.3 Ansi Driver};option=3;database=xxx;user=root;password=yyy;"
    dbConn.Open

    'Execute new command
    Set dbCmd = New ADODB.Command
    With dbCmd
        Set .ActiveConnection = dbConn
        .CommandTimeout = 0
        .CommandType = adCmdStoredProc
        .CommandText = "testit"
        .Parameters.Append dbCmd.CreateParameter("iTest", adInteger, adParamOutput)
        .Execute
        dbTestIt = dbCmd.Parameters.Item(0).Value
    End With

    'Close Connection
    dbConn.Close

End Function

以下是测试结果:

  1. 电脑上,dbTestIt() 总是返回 123;
  2. 计算机上,dbTestIt() 返回随机值(例如 51、1936020585、1);
  3. 如果我从新计算机连接到计算机上的 MySQL 服务器(在连接字符串中使用 server=192.168.1.x),它也总是返回 123;
  4. 这告诉我问题(仅)在计算机上的MySQL 服务器中(对吗?);
  5. 但是,如果我从旧计算机连接到计算机上的 MySQL 服务器,它也总是返回 123!

所以问题似乎出在计算机上的组件组合上,但是哪个和为什么?以及如何测试它?

有人有什么好主意吗?

4

3 回答 3

3

为了进一步定位问题的原因,我将新电脑上的MySQL ODBC驱动5.3.6降级到5.3.4版本(旧电脑上),现在可以正常使用了!为了确认确实是这个原因,我再次升级到 5.3.6 版本,再次失败。

因此,看起来 MySQL ODBC 驱动程序 5.3.6(8 个月前发布!)在处理(本地)MySQL 服务器 5.7.16 的输出参数时存在问题,可能仅与 ADODB 和 Windows 10 结合使用。

所以目前我将使用 5.3.4 版本并向 MySQL 报告错误。

于 2016-11-15T09:05:32.027 回答
1

MySQL 服务器版本 5.7 与最新的 ODBC 连接器存在兼容性问题。将服务器降级到 5.6 版解决了这个问题。

于 2018-04-19T10:04:10.950 回答
1

即使在 4 年后,这个 bug 仍然存在。由于我无法让任何 MySQL 5.3/8.0 ODBC 驱动程序与 MySQL Server 8.0.22 一起使用,并且我不想再被这个 bug 挟持,我决定从存储过程(带有输出参数)切换到一个存储函数(带有返回值)并在上面的 VBA 示例中进行了一些更改:

.CommandType = adCmdText
.CommandText = "select testit() as parOut"
Set dbRest = .Execute
dbTestIt = dbRest!parOut
于 2020-11-28T20:48:34.703 回答