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

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
KA3AKOB
Сообщения: 5
Зарегистрирован: 18 дек 2006, 11:35

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

Сообщение KA3AKOB » 26 янв 2007, 14:53

Написал для примера простейшую 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. Если надо использовать её, то как?
Заранее благодарю за советы.
Казаков С.А.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 янв 2007, 15:27

что используется (какой драйвер) для доступа через ADO? альтернативы меняют ситуацию?

KA3AKOB
Сообщения: 5
Зарегистрирован: 18 дек 2006, 11:35

Сообщение KA3AKOB » 26 янв 2007, 16:40

Использую единственный доступный мне бесплатный драйвер
LCPI.IBProvider(Free).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 янв 2007, 16:43

гм. а к нему примеры подобного вызова есть?

KA3AKOB
Сообщения: 5
Зарегистрирован: 18 дек 2006, 11:35

Сообщение KA3AKOB » 26 янв 2007, 16:58

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

KA3AKOB
Сообщения: 5
Зарегистрирован: 18 дек 2006, 11:35

Сообщение KA3AKOB » 26 янв 2007, 17:16

Могу, например, добавить что долго не работал код вида:

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

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

KA3AKOB
Сообщения: 5
Зарегистрирован: 18 дек 2006, 11:35

Сообщение KA3AKOB » 29 янв 2007, 18:05

Поставил самую новую версию LCPI.IBProvidera (v3) и всё заработало.

Ответить