Важно, что у неё есть входной параметр и выходной параметр.
Код: Выделить всё
CREATE PROCEDURE CNTLISTS (
I INTEGER)
RETURNS (
LSTCNT INTEGER)
AS
begin
SELECT COUNT(*) FROM addresslists INTO :lstcnt;
lstcnt = lstcnt + i;
end;
Код: Выделить всё
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
cmd2.Execute
порождает ошибку:
Run-time error '-2147217887 (80040e21)
Bind parameters errors:
[0]:[code:0x80040E55]Bad In-parameter ordinal:1-range[1..0]
Эту же SQL процедуру я попробовал вызвать из аналогичного приложения написанного уже на С++, та же ошибка. Т.е. дело в ADO.
Любопытно, что если я создаю аналогичную процедуру, содержащую только входные параметры, то всё работает, я проверял. Точно также похожая процедура, содержащая только выходной параметр, тоже работает. Кто подскажет, в чём неправильность? Как вообще привязывать параметры. Есть какя-то загадочная структура, типа SAFEARRAY. Если надо использовать её, то как?
Заранее благодарю за советы.
Казаков С.А.