Форум: "Базы";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизTADOQuery+output параметры Найти похожие ветки
← →
Maverick © (2006-07-06 11:35) [0]Здравствуйте!
Мастера, порулите вопрос. Как правильно обозначть output параметр в TADOQuery?
Что имеется в виду:
например надо вернуть id последний вставленной записи. поэтому в свойстве ADOQuery.SQL пишу так
........................................
DECLARE @id integer
INSERT INTO table(field)
VALUES (:field)
SET @id=SCOPE_IDENTITY()
........................................
:field - input параметр
как павильно присвоить output параметру :id значение @id ?
можно конечно написать:
........................................
SELECT @id as "id"
...................................
и быть счастливым,
но хочется вернуть output параметр
← →
Ega23 © (2006-07-06 11:42) [1]
> можно конечно написать:
> ........................................
> SELECT @id as "id"
> ...................................
> и быть счастливым,
> но хочется вернуть output параметр
>
Лучше написать именно так.
Причём даже так:
DECLARE @id integer
Set NoCount ON
INSERT INTO table(field)
VALUES (:field)
Set NoCount OFF
Select Result=SCOPE_IDENTITY()
А ещё лучше оформить это дело хранимаой процедурой и вызывать уже её.
← →
Ega23 © (2006-07-06 11:44) [2]
> Ega23 © (06.07.06 11:42) [1]
>
>
Точнее, Declare тут вообще не надо...
← →
Maverick © (2006-07-06 11:51) [3]>Ega23 © (06.07.06 11:42) [1]
ок, спасибо.
кстати, по поводу хранимых процедур...естественно это удобнее, быстрее и т.д.(обычно так всегда и делаю), но вот что меня всегда смущало:
есть некая система со своей логикой, там куча процедур обеспечивающих логику системы...и есть клиентское приложение (мониторинг, некая тулза для управления), для него надо писать кучу маленьких процедур часто из одного insert"a или select"a...хотя наверно это тема для отдельного топика
что думаете?
← →
Ega23 © (2006-07-06 11:59) [4]Я обычно делаю так.
Есть какая-то сущность. Например - сотрудник.
Создаю процедуру S_Persons, объявляю параметр @ActNam varchar(32).
А дальшеDeclare @Result int
Set @Result=0
Set NoCount ON
if @ActNam="ADD"
begin
Insert into Persons (....) Values (.....)
Select @Result=@@IDENTITY
Goto Fin
end
if @ActNam="UPD"
begin
Update Persons Set ...
where PersID=@PersID;
Select @Result=PersID
Goto Fin
end
if @ActNam="DEL"
begin
Delete Persons where PersID=@PersID
Select @Result=PersID
Goto Fin
end
if @ActNam="SEL"
begin
Set NoCount OFF
Select * from Persons (тут ещё куча таблиц может быть прилинкована)
Order By ...
Goto Fin
end
:FIN
set nocount off;
return(@result);
GO
Таким образом на каждую сущность получаем свою процедуру, отвечающую за полную работу с этой сущностью.
← →
Maverick © (2006-07-06 12:09) [5]>Ega23 © (06.07.06 11:59) [4]
один из вариантов...но глобально проблемы не решает, т.к. и сущностей может быть много и select"ов по ним, но за мысль спасибо :)
← →
Ega23 © (2006-07-06 13:03) [6]
> т.к. и сущностей может быть много и select"ов по ним,
Ну, для разных Select"ов - разные ActNam.
Просто я уже давно придерживаюсь правила, что у клиента не должно быть прямых вызовов SQL. Всё ТОЛЬКО через хп. Любые запросы, любые вставки и .т.п.
Сильно жизнь упрощает.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c