我有一个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
在我的机器上,对于几乎所有用户,此操作都会返回:
结果:错误/快速的褐狐狸跳过了那只懒狗。
但是对于一个用户,它返回:
结果:对/
我可以在我的机器和用户的机器之间找到的唯一区别是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中进行了相应的更改。现在在我的机器上它返回:
结果:12345 /敏捷的棕色狐狸跳过了那只懒狗。
并在该用户的计算机上返回:
结果:232718680 /
@wchiquito指出,这很可能与MySQL错误#83698有关,即使我一直无法在其他地方复制准确的行为(由于我公司特殊的网络设置和安全性限制),我也同意这很可能是罪魁祸首。
自问了这个问题之后,我重新编写了存储过程和关联的电子表格,使其仅通过Recordset返回数据。IMO并没有“干净”,但至少可以在所有用户的机器上使用。不过,如果有人能找到一种使OUT
参数起作用的方法(或者MySQL是否曾决定修复此错误),请告诉我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句