ms访问中的ADO Command对象

时间:2011-07-05 12:54:56

标签: ms-access vba ado

我不明白为什么以下代码失败。不幸的是,为了能够重现该问题,您必须创建一个有效的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”也可以使用,但不会限制为整数。

1 个答案:

答案 0 :(得分:2)

我已经找到了解决这个问题的方法。仍然不确定为什么这个工作和原始代码不会!基本上我使用一种微妙的不同方式来绑定参数:

而不是:

.Parameters.Append .CreateParameter(, adInteger, adParamInput, , lngAssemblyId)

改为使用:

.Parameters(0).Direction = adParamInput
.Parameters(0).Type = adInteger
.Parameters(0).Value = lngAssemblyId