我不明白为什么以下代码失败。不幸的是,为了能够重现该问题,您必须创建一个有效的mysql连接对象,或至少另一个ODBC兼容的数据库。
以下代码基本上调用存储过程,例如CALL my_procedure(12345);
代码:
' Create ADODB Connection object
Dim oConn As Object
Set oConn = CreateObject("ADODB.Connection")
Const MYSQL_DRIVER = "{MySQL ODBC 5.1 Driver}"
Const MYSQL_SERVER = "10.32.27.6"
Const MYSQL_DATABASE = "sales"
Const MYSQL_USER = "root"
Const MYSQL_PASSWORD = "xxxxxx"
oConn.ConnectionString = "DRIVER=" & MYSQL_DRIVER & ";Server=" & MYSQL_SERVER & ";Database=" & MYSQL_DATABASE & ";Uid=" & MYSQL_USER & ";Pwd=" & MYSQL_PASSWORD & ";"
oConn.Open
' parameter value
Dim lngAssemblyId As Long
lngAssemblyId = 12345
' Create ADODB.Command
Const adCmdText = 1
Const adParamInput = 1
Const adInteger = 3
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
With cmd
Set .ActiveConnection = oConn
.CommandType = adCmdText
.CommandText = "CALL my_procedure(?)"
.Prepared = True
.Parameters.Append .CreateParameter(, adInteger, adParamInput, , lngAssemblyId)
End With
' execute command
Call cmd.Execute
Set cmd = Nothing
上面的代码将生成错误“不支持参数类型”。在Call cmd.Execute
行
我发现了一些修复但我不明白为什么会有效!
修复1
a)添加对“Microsoft ActiveX Data Objects 2.8 Library”的引用
b)然后更改代码的这一部分:
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
使用此代码:
Dim cmd as New ADODB.Command
修复2
将adInteger的值从3更改为20.值20表示ADODB.DataTypeEnum中的adBigInteger而不是adInteger。 adBigInteger是一个8字节的数据类型,而vba中的'long'数据类型和mysql中的'INT'数据类型都是4字节数据类型,所以这没有意义。
Fix3
将lngAssemblyId的变量类型从Long更改为Integer。这很奇怪,因为1)我不需要将变量限制为修复1中的整数
编辑:将数据类型更改为“Variant”也可以使用,但不会限制为整数。
答案 0 :(得分:2)
我已经找到了解决这个问题的方法。仍然不确定为什么这个工作和原始代码不会!基本上我使用一种微妙的不同方式来绑定参数:
而不是:
.Parameters.Append .CreateParameter(, adInteger, adParamInput, , lngAssemblyId)
改为使用:
.Parameters(0).Direction = adParamInput
.Parameters(0).Type = adInteger
.Parameters(0).Value = lngAssemblyId