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

时间:2018-01-03 19:51:29

标签: mysql excel vba stored-procedures out-parameters

我有一个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

在我的计算机上,对于几乎所有用户,这将返回:

  

结果:错误/快速的棕色狐狸跳过懒狗。

但是对于一个用户,它会返回:

  

结果:True /

我可以在我的机器和用户之间找到的唯一区别是MySQL ODBC 5.3 ANSI和Unicode驱动程序版本。我的版本 5.03.02.00 ,最初此用户的版本较旧。我让他升级,现在他的版本 5.03.09.00 (比我的版本更新),但问题仍然存在。

我有什么遗失的东西吗?是否存在可能导致OUT参数停止工作的某种机器级配置变量?或者OUT参数仅适用于某些选择的驱动程序版本吗?

更新:我修改了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中做了相应的更改。现在在我的机器上它返回:

  

结果:1​​2345 /快速的棕色狐狸跳过懒狗。

在这个用户的机器上它返回:

  

结果:232718680 /

1 个答案:

答案 0 :(得分:0)

@wchiquito指出这可能与MySQL Bug #83698有关,即使我无法在其他地方复制精确行为(由于我公司特有的网络设置和安全限制)我同意这很可能是罪魁祸首。

自从提出这个问题以来,我已经重写了存储过程和相关的电子表格,只能通过Recordset返回 数据。它不像IMO那样“干净”,但至少它适用于所有用户的机器。尽管如此,如果有人能找到让OUT params工作的方法(或者如果MySQL决定修复这个bug),请告诉我。