Mysql 输出参数don';有些用户无法使用
我有一个Excel工作表,需要多次调用MySQL服务器。以下是简化的VBA代码,用于说明此问题: 公共函数Connect()作为ADODB.Connection Dim cn作为新的ADODB.连接 与cn .ConnectionString=“” .Properties(“初始目录”).Value=“” .Properties(“用户ID”).Value=“” .Properties(“密码”).Value=“” .CommandTimeout=1500 以 设置Connect=cn 端函数 公共子测试存储过程() Dim cxn作为ADODB.连接 Dim cmd作为新的ADODB.Command 尺寸p1作为ADODB.参数 将p2设置为ADODB.参数 设置cxn=Connect() 打开 设置cmd.ActiveConnection=cxn cmd.CommandType=adCmdStoredProc cmd.CommandText=“输出参数测试” 设置p1=cmd.CreateParameter(,adBoolean,adParamOutput) Set p2=cmd.CreateParameter(,adVarChar,adParamOutput,255) cmd.Parameters.Append p1 cmd.Parameters.Append p2 cmd.Execute MsgBox“结果:&p1.Value&“/”&p2.Value 端接头 这将执行以下存储过程:Mysql 输出参数don';有些用户无法使用,mysql,excel,vba,stored-procedures,out-parameters,Mysql,Excel,Vba,Stored Procedures,Out Parameters,我有一个Excel工作表,需要多次调用MySQL服务器。以下是简化的VBA代码,用于说明此问题: 公共函数Connect()作为ADODB.Connection Dim cn作为新的ADODB.连接 与cn .ConnectionString=“” .Properties(“初始目录”).Value=“” .Properties(“用户ID”).Value=“” .Properties(“密码”).Value=“” .CommandTimeout=1500 以 设置Connect=cn 端函数
创建过程`输出参数测试`(
出‘可用’位,
OUT`markets`VARCHAR(255)
)
语言SQL
确定性
包含SQL
SQL安全定义程序
注释“”
开始
设置isAvailable=false;
设置备注=“敏捷的棕色狐狸跳过懒惰的狗”;
结束
在我的机器上,对于几乎所有用户,这会返回:
结果:错误/敏捷的棕色狐狸跳过了懒惰的狗
但对于一个用户,它返回:
结果:正确/
在我的机器和用户的机器之间,我能找到的唯一区别是MySQL ODBC 5.3 ANSI和Unicode驱动程序版本。我的版本为5.03.02.00,最初该用户的版本较旧。我要求他升级,他现在有版本5.03.09.00(比我的更新),但问题仍然存在
有什么我遗漏的吗?是否有某种机器级配置变量会导致OUT
参数停止工作?或者OUT
参数是否仅在某些选定的驱动程序版本中起作用
更新:我对SP进行了如下修改:
创建过程`输出参数测试`(
OUT`num`INT,
OUT`markets`VARCHAR(255)
)
开始
设置num=12345;
设置备注=“敏捷的棕色狐狸跳过懒惰的狗”;
结束
并对VBA进行了相应的修改。现在在我的机器上,它返回:
结果:12345/敏捷的棕色狐狸跳过了懒惰的狗
在该用户的机器上,它返回:
结果:232718680/
指出这可能与MySQL有关,尽管我无法在其他地方复制精确的行为(由于我公司独特的网络设置和安全限制),但我同意这很可能是罪魁祸首
自从提出这个问题以来,我重新编写了存储过程和相关的电子表格,以便仅通过记录集返回数据。依我看,它并没有那么“干净”,但至少它可以在所有用户的机器上工作。不过,如果有人能找到方法让
参数运行(或者如果MySQL决定修复这个bug),请告诉我。我不知道这个MCVE如何能为p1
返回真的,但不管怎样,这是一个有趣的问题。@Mat'sMug同意,这很奇怪。我的工作假设是,在这个过程中的某个地方,它最终尝试进行类型转换。我对MySQL不是很熟悉,但我假设Set isAvailable=false
正在将其设置为0
(假设false
在某个地方被定义为这样)。显式设置为0
是否会改变结果?使存储过程返回常量/显式0
将排除SQL成为问题的可能性(…尽管,假设所有用户都连接到同一台服务器,这应该已经被排除)检查。@Mat'sMug这不会改变结果。然而,当我将参数更改为INT
时,我得到了更有趣的结果。请参阅我的最新问题。在我看来,它可能返回一个指针,而不是实际值。