Я не понимаю, почему следующий код не работает. К сожалению, чтобы иметь возможность воспроизвести проблему, вы должны создать действительный объект подключения 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
Я нашел пару исправлений, но я не понимаю, почему они работают!
Fix 1
а) Добавить ссылку на «Библиотеку объектов данных Microsoft ActiveX 2.8»
б) Затем измените эту часть кода:
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
с этим кодом:
Dim cmd as New ADODB.Command
Fix 2
Измените значение adInteger с 3 на 20. Значение 20 представляет adBigInteger из ADODB.DataTypeEnum вместо adInteger. adBigInteger - это 8-байтовый тип данных, тогда как тип данных long в vba и тип данных INT в mysql являются 4-байтовыми типами данных, так что это не имеет смысла.
Fix3
Измените тип переменной lngAssemblyId с Long на Integer. Это странно, потому что 1) мне не нужно ограничивать переменную целым числом в исправлении 1.
РЕДАКТИРОВАТЬ : изменение типа данных на «Вариант» также работает без недостатка ограничения целым числом.