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