我已经(几乎)尝试了一切来隔离问题,但我迷路了。
我有一个使用 ADODB 连接到本地 MySQL 数据库的 MS Access 应用程序。我将它复制到一台新计算机上,但现在存储过程的输出参数每次都包含一个随机值(如果通过 ADODB 完成)。在 MySQL WorkBench 中执行时,输出参数正确。
以下是两台电脑的规格:
- 旧:Windows 7 Pro、Office 2010 ProPlus、MySQL ODBC 5.3.4、MySQL server 5.6.22(都是64位;也安装了32位ODBC);
- 新: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
以下是测试结果:
- 在旧电脑上,dbTestIt() 总是返回 123;
- 在新计算机上,dbTestIt() 返回随机值(例如 51、1936020585、1);
- 如果我从新计算机连接到旧计算机上的 MySQL 服务器(在连接字符串中使用 server=192.168.1.x),它也总是返回 123;
- 这告诉我问题(仅)在新计算机上的MySQL 服务器中(对吗?);
- 但是,如果我从旧计算机连接到新计算机上的 MySQL 服务器,它也总是返回 123!
所以问题似乎出在新计算机上的组件组合上,但是哪个和为什么?以及如何测试它?
有人有什么好主意吗?