-
Помогите понять магию и логику адо при выполнении хранимок на mssql. Исходные данные:
хранимая на сервере, три входных параметра, шесть выходных.
Сама процедура отлажена и возвращает то что нужно. Кроме того, прекрасно выполняется из под asp.net и других хранимых процедур на самом сервере.
В Д7 вызываю так:
with TADOCommand.Create(Self) do
try
Connection := ADOConnection;
CommandType := cmdStoredProc;
CommandText := 'my_procedure';
with Parameters.AddParameter do
begin
Direction := pdReturnValue;
DataType := ftInteger;
Name := '@return_value';
end;
with Parameters.AddParameter do
begin
Direction := pdInput;
DataType := ftString;
Size := 20;
Name := '@p_cnt_num';
Value := ...
end;
....
with Parameters.AddParameter do
begin
Direction := pdInputOutput;
DataType := ftFloat;
Name := '@p_oborot_db';
end;
Execute;
А дальше все зависит от фаз луны.
Может ругнуться на то, что ожидается параметр '@p_oborot_db который не определен.
Может ни на что не ругнуться но в половине выходных параметрах будут верные данные, в остальных либо пусто, либо неверные данные.
Если настроить ADoCommand в дизайне, то все работает как надо. Но мне необходимо создавать экземпляр динамически, или по крайней мере менять имя владельца в имени процедуры на рантайме (БД на разных серверах по разному называется), а при этом параметры установаленные в дизайнтайме говорят мне "привет".
-
А че, TADOStoredProc - не кошерный компонент?
-
Не надо параметры строить вручную - это приводит к множественным ошибкам и скоропалительном выводе о глючности ADO
Я бы не рекоментдовал использовать TADOStoredProc вообще (она "удобна" в дизайне, т.к. дает возможности извлечь параметры и задать им значения визуально)
Грамотнее делать так:
with ADOCommand1 do
try
CommyndType := cmdStoredProc;
CommandText := ...
Parameters.Refresh;
Parameters.ParamByName(..).Values := ..;
Parameters.ParamByName(..).Values := ..;
Execute;
except
..
end;
-
пробовал, не помогает.
После Parameters.Refresh ParamCount = 0
-
> Не надо параметры строить вручную - это приводит к множественным
> ошибкам и скоропалительном выводе о глючности ADO
:))))))))
Я, пожалуй, помолчу...
-
>Барра Кабамма (10.11.08 15:18) [3]
>пробовал, не помогает.
Очевидно, не так пробовал. Для указания ошибки в конкретном случае мало привести код, надо еще и саму ХП.
И, кстати, собака в именах параметров имеется в самой декларации ХП ?
-
собака в именах параметров в хранимке есть. модификатор out для выходных тоже есть.
а сама процедура в процессе тестирования и ловли бага адо выродилась до банального присвоения выходным параметрам литеральных значений без всяких селектов.
....
set @p_oborot_db = 3.62;
set @p_oborot_cr = 4.12;
return 0;
end
-
> Я, пожалуй, помолчу...
все правильно, если в десигне там где код написан борландавцами не забыли сделать рефреш параметрам/не дублировать их/правильные типы выставить и т.д. то оно и не глючит. а при ручном создании нужно как минимум понимать что делаешь и зачем. без этого не работает/глюки, но на себя любимого никто не думает, что сам глючит....
а потому либо пользуйся готовым за тебя написанным, либо не жалуйся, а изучай то с чем работаешь.
> и ловли бага адо
лови не баги ado, а свои, и все у тебя получится.
-
нужно как минимум понимать что делаешь и зачем
Знаешь что я первым делом сделал, когда глюк обнаружил?
Настроил все в дизайне через редактор параметров и открыл dfm.
Потом сравнил все что туда попало со своим кодом.
Все тоже самое.
-
> После Parameters.Refresh ParamCount = 0
коннект к серверу в момент рефреша есть?
-
конечно есть
-
> Все тоже самое.
а у меня нет, но всегда работает...
-
а у меня нет, но всегда работает...
Здесь напрашивается вывод, что свойства параметров, создаваемых в рантайме должны отличаться от дизайновых и что ты знаешь как именно.
А рассказать можешь?
-
> Здесь напрашивается вывод
неправильный вывод...
см. правильный код
MsGuns © (10.11.08 15:11) [2]
где видишь создание параметров?
-
Ну ё-мае, мужики. Сколько можно?
Тот правильный код правилен только для него самого.
Ноль параметров у меня после рефреша. Ноль!
-
кстати у тебя не все тоже самое, если бы было тоже
то было бы так
CommandText := 'my_procedure;1';
-
> Ну ё-мае, мужики. Сколько можно?
действительно...
> Ноль параметров у меня после рефреша. Ноль!
значит варианты
MsGuns © (10.11.08 15:38) [5]
> Очевидно, не так пробовал.
sniknik © (10.11.08 16:15) [9]
> коннект к серверу в момент рефреша есть?
-
;1
и так тоже делал.
и два раза приседал и крек-пекс-фекс тоже говорил.
-
sniknik © (10.11.08 16:15) [9]
> коннект к серверу в момент рефреша есть?
До возни с этой процедурой приложение уже успело выполнить с десяток запросов с mssql. Авторизовать пользователя, прочитать его профиль, вставить кучу записей в лог таблицу и т.д.
-
В общем резюмирую, мужики.
Вся ваша уверенность в безгрешности делфийского адо и собственного умения с ним работать зиждется на ограниченном жизненном опыте. Написали сотню однотипных хранимок, которые работают из под адо и все.
У меня тоже сотня хранимок работает. Одни возвращают наборы данных, другие строковые параметры.
А вот эта не работает из под делфийского адо.
И ни вы, ни я не знаете почему.