Страница 1 из 1

Как передавать параметры в процедуру, используя ADO?

Добавлено: 26 янв 2007, 14:53
KA3AKOB
Написал для примера простейшую SQL процедуру, она ничего полезного в базе не делает, важен пример её вызова.
Важно, что у неё есть входной параметр и выходной параметр.

Код: Выделить всё

CREATE PROCEDURE CNTLISTS (
    I INTEGER)
RETURNS (
    LSTCNT INTEGER)
AS
begin
  SELECT COUNT(*) FROM addresslists INTO :lstcnt;
  lstcnt = lstcnt + i;
end;
Пишу на VBA в Outlooke код:

Код: Выделить всё

  Set cmd2 = New ADODB.Command
    cmd2.ActiveConnection = conn    ' используем уже имеющееся подключение к базе
    cmd2.CommandType = adCmdStoredProc
    cmd2.CommandText = "CNTLISTS" 'имя процедуры
    cmd2.NamedParameters = True   'не очень понятно зачем, но радо
    cmd2.Parameters.Append cmd2.CreateParameter("I", adInteger, adParamInput, 4)    'первый параметр входной
    cmd2.Parameters.Append cmd2.CreateParameter("LSTCNT", adInteger, adParamOutput, 4)    ' второй выходной
    conn.BeginTrans
    cmd2.Parameters(0).Value = 6     ' значение для первого параметра
    cmd2.Execute        ' здесь возникает ошибка
    conn.CommitTrans
    Debug.Print cmd2.Parameters(1).Value ' печать значения выходного
    Set cmd2 = Nothing
Строку подключения объекта conn типа ADODB.Connection не привожу, но верьте на слово, что подключение правильное. Но загвоздка в том, что команда
cmd2.Execute
порождает ошибку:
Run-time error '-2147217887 (80040e21)
Bind parameters errors:
[0]:[code:0x80040E55]Bad In-parameter ordinal:1-range[1..0]

Эту же SQL процедуру я попробовал вызвать из аналогичного приложения написанного уже на С++, та же ошибка. Т.е. дело в ADO.
Любопытно, что если я создаю аналогичную процедуру, содержащую только входные параметры, то всё работает, я проверял. Точно также похожая процедура, содержащая только выходной параметр, тоже работает. Кто подскажет, в чём неправильность? Как вообще привязывать параметры. Есть какя-то загадочная структура, типа SAFEARRAY. Если надо использовать её, то как?
Заранее благодарю за советы.
Казаков С.А.

Добавлено: 26 янв 2007, 15:27
kdv
что используется (какой драйвер) для доступа через ADO? альтернативы меняют ситуацию?

Добавлено: 26 янв 2007, 16:40
KA3AKOB
Использую единственный доступный мне бесплатный драйвер
LCPI.IBProvider(Free).

Добавлено: 26 янв 2007, 16:43
kdv
гм. а к нему примеры подобного вызова есть?

Добавлено: 26 янв 2007, 16:58
KA3AKOB
Примеры я взял с MSDN, там примеры для Accessa и MS SQL, естественно. Но ведь ADODB, это же стандарт. Я могу, конечно, набросать примеров, но точно таких запросов пока не нашёл, поэтому и пишу в конференцию. Собственно вопрос распадается на два вопроса:
1) Что за ошибка, что значит Bind parameter?
2) Как правильно писать код на VBA и C++, чтобы не было ошибки.

Добавлено: 26 янв 2007, 17:16
KA3AKOB
Могу, например, добавить что долго не работал код вида:

cmd2.Parameters.Append cmd2.CreateParameter("Class", adSmallInt, adParamInput, 2, -1)
cmd2.Parameters.Append cmd2.CreateParameter("AddressList_ID", adInteger, adParamInput, 4, -1)
cmd2.Execute

Пока не добавил строчку
cmd2.NamedParameters = True

тоже шли ошибки.

Добавлено: 29 янв 2007, 18:05
KA3AKOB
Поставил самую новую версию LCPI.IBProvidera (v3) и всё заработало.