Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TADOCommand + MSSQL + SP [D7, MSSQL]


Страницы:   1 2

Барра Кабамма ©   (2008-11-10 15:01:00) 

Помогите понять магию и логику адо при выполнении хранимок на 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 в дизайне, то все работает как надо. Но мне необходимо создавать экземпляр динамически, или по крайней мере менять имя владельца в имени процедуры на рантайме (БД на разных серверах по разному называется), а при этом параметры установаленные в дизайнтайме говорят мне "привет".


sniknik   (2008-11-10 16:33:00) [21]

кстати у тебя не все тоже самое, если бы было тоже
то было бы так
CommandText := 'my_procedure ;1';


Барра Кабамма   (2008-11-10 16:33:00) [22]

Ну ё-мае, мужики. Сколько можно?
Тот правильный код правилен только для него самого.
Ноль параметров у меня после рефреша. Ноль!


sniknik   (2008-11-10 16:29:00) [23]

> Здесь напрашивается вывод
неправильный вывод...

см. правильный код
MsGuns ©   (10.11.08 15:11) [2]
где видишь создание параметров?


Барра Кабамма   (2008-11-10 16:26:00) [24]

а у меня нет, но всегда работает...

Здесь напрашивается вывод, что свойства параметров, создаваемых в рантайме должны отличаться от дизайновых и что ты знаешь как именно.
А рассказать можешь?


sniknik   (2008-11-10 16:17:00) [25]

> Все тоже самое.
а у меня нет, но всегда работает...


Барра Кабамма   (2008-11-10 16:15:00) [26]

конечно есть


sniknik   (2008-11-10 16:15:00) [27]

> После  Parameters.Refresh ParamCount = 0
коннект к серверу в момент рефреша есть?


Барра Кабамма   (2008-11-10 16:14:00) [28]

нужно как минимум понимать что делаешь и зачем

Знаешь что я первым делом сделал, когда глюк обнаружил?
Настроил все в дизайне через редактор параметров и открыл dfm.
Потом сравнил все что туда попало со своим кодом.
Все тоже самое.


sniknik   (2008-11-10 16:11:00) [29]

> Я, пожалуй, помолчу...
все правильно, если в десигне там где код написан борландавцами не забыли сделать рефреш параметрам/не дублировать их/правильные типы выставить и т.д. то оно и не глючит. а при ручном создании  нужно как минимум понимать что делаешь и зачем. без этого не работает/глюки, но на себя любимого никто не думает, что сам глючит....
а потому либо пользуйся готовым за тебя написанным, либо не жалуйся, а изучай то с чем работаешь.

> и ловли бага адо
лови не баги ado, а свои, и все у тебя получится.


Барра Кабамма   (2008-11-10 15:52:00) [30]

собака в именах параметров в хранимке есть. модификатор out для выходных тоже есть.

а сама процедура в процессе тестирования и ловли бага адо выродилась до банального присвоения выходным параметрам литеральных значений без всяких селектов.

....
set @p_oborot_db = 3.62;
set @p_oborot_cr = 4.12;
return 0;
end


MsGuns   (2008-11-10 15:38:00) [31]

>Барра Кабамма   (10.11.08 15:18) [3]
>пробовал, не помогает.

Очевидно, не так пробовал. Для указания ошибки в конкретном случае мало привести код, надо еще и саму ХП.
И, кстати, собака в именах параметров имеется в самой декларации ХП ?


GRAND   (2008-11-10 15:19:00) [32]


> Не надо параметры строить вручную - это приводит к множественным
> ошибкам и скоропалительном выводе о глючности ADO


:))))))))

Я, пожалуй, помолчу...


Барра Кабамма   (2008-11-10 15:18:00) [33]

пробовал, не помогает.

После  Parameters.Refresh ParamCount = 0


MsGuns   (2008-11-10 15:11:00) [34]

Не надо параметры строить вручную - это приводит к множественным ошибкам и скоропалительном выводе о глючности ADO

Я бы не рекоментдовал использовать TADOStoredProc вообще (она "удобна" в дизайне, т.к. дает возможности извлечь параметры и задать им значения визуально)
Грамотнее делать так:

with ADOCommand1 do
 try
   CommyndType := cmdStoredProc;
   CommandText := ...
   Parameters.Refresh;
   Parameters.ParamByName(..).Values := ..;
   Parameters.ParamByName(..).Values := ..;
   Execute;
 except
   ..
 end;


GRAND   (2008-11-10 15:10:00) [35]

А че, TADOStoredProc - не кошерный компонент?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо