OUT 参数对某些用户不起作用

OUT parameters don't work for some users

我有一个 Excel 工作表,需要对 MySQL 服务器进行多次调用。这是 VBA 代码,经过简化以说明此问题:

Public Function Connect() As ADODB.Connection
    Dim cn As New ADODB.Connection
    With cn
        .ConnectionString = "<Server>"
        .Properties("Initial Catalog").Value = "<DB>"
        .Properties("User ID").Value = "<User>"
        .Properties("Password").Value = "<Password>"
        .CommandTimeout = 1500
    End With
    Set Connect = cn
End Function

Public Sub TestSProc()
    Dim cxn As ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim p1 As ADODB.Parameter
    Dim p2 As ADODB.Parameter
    Set cxn = Connect()
    cxn.Open
    Set cmd.ActiveConnection = cxn
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "OutParamTest"
    Set p1 = cmd.CreateParameter(, adBoolean, adParamOutput)
    Set p2 = cmd.CreateParameter(, adVarChar, adParamOutput, 255)
    cmd.Parameters.Append p1
    cmd.Parameters.Append p2
    cmd.Execute
    MsgBox "Result: " & p1.Value & " / " & p2.Value
End Sub

这将执行以下存储过程:

CREATE PROCEDURE `OutParamTest`(
    OUT `isAvailable` BIT,
    OUT `remarks` VARCHAR(255)
)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
  SET isAvailable = false;
  SET remarks = 'The quick brown fox jumps over the lazy dog.';
END

在我的机器上,对于 几乎所有 用户,这个 returns:

Result: False / The quick brown fox jumps over the lazy dog.

但是对于一个用户,它returns:

Result: True /

我能在我的机器和用户的机器之间找到的唯一区别是 MySQL ODBC 5.3 ANSI 和 Unicode 驱动程序版本。我的版本是 5.03.02.00,原来这个用户的版本比较旧。我让他升级了,现在他的版本是5.03.09.00(比我的新),但是问题依旧。

有什么我想念的吗?是否存在某种可能导致 OUT 参数停止工作的机器级配置变量?还是 OUT 参数仅适用于某些 select 驱动程序版本?


更新: 我修改了 SP 如下:

CREATE PROCEDURE `OutParamTest`(
    OUT `num` INT,
    OUT `remarks` VARCHAR(255)
)
BEGIN
  SET num = 12345;
  SET remarks = 'The quick brown fox jumps over the lazy dog.';
END

并在VBA中做了相应的修改。现在在我的机器上 returns:

Result: 12345 / The quick brown fox jumps over the lazy dog.

并且在这个用户的机器上 returns:

Result: 232718680 /

pointed out that this is likely related to MySQL Bug #83698,尽管我无法在其他地方复制精确的行为(由于我公司特殊的网络设置和安全限制),我同意这很可能是罪魁祸首。

自从问了这个问题后,我通过 Recordset 将存储过程和关联的电子表格重写为 return 数据 only。它不像 'clean',IMO,但至少它适用于所有用户的机器。不过,如果有人能找到让 OUT 参数正常工作的方法(或者如果 MySQL 决定修复此错误)请告诉我。