Объект команды ADO в msaccess - PullRequest
3 голосов
/ 05 июля 2011

Я не понимаю, почему следующий код не работает. К сожалению, чтобы иметь возможность воспроизвести проблему, вы должны создать действительный объект подключения 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.
РЕДАКТИРОВАТЬ : изменение типа данных на «Вариант» также работает без недостатка ограничения целым числом.

1 Ответ

2 голосов
/ 28 июля 2011

С тех пор я нашел решение этой проблемы. Все еще не уверены, почему это работает, а оригинальный код - нет! В основном я использую немного другой способ привязки параметров:

Вместо этого:

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

используйте это вместо:

.Parameters(0).Direction = adParamInput
.Parameters(0).Type = adInteger
.Parameters(0).Value = lngAssemblyId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...