-
подскажите, кто по опотнее
sql server 2005 таблица: table_1 ( id int IDENTITY(1,1) NOT NULL, name varchar(50) )
Delphi 7, в ADOQuery: insert into table_1(name) output inserted.id values('qwerty')
При первом запуске ADOQuery срабатывает как и нужно -добавляет запись и возврашает строку со значением id. При повторном запуске: EOLEException: "Ошибка подключения"
Что может быть?
-
> insert into table_1(name) output inserted.id values('qwerty')
Первый раз такую конструкцию вижу. Даже и не знал, что так можно. Обычно делаю так: Set NoCount ON
insert into table_1(name) values('qwerty')
Select Result = Scope_Identity()
Ну и выполняешь это дело через Open, далее либо FieldByName('Result').AsInteger либо Fields[0].AsInteger А если ещё точнее, то это дело в хранимку оборачиваю. Но это уже отдельная тема.
-
Это синтаксис 2005, зато inserted.id это не скаляр и вся конструкция по сути является ошибкой.
-
kile © (28.10.08 22:08) Интересно ты придумал получать ID, лучше как в Ega23 © (29.10.08 13:48) [1]
Ega23 © (29.10.08 13:48) [1] OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю где и применить можно.
-
> OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю > где и применить можно.
Ты сам себе противоречишь.... :)))
-
Ega23 © (29.10.08 17:26) [4] Почему ? :)
-
Или ты не знаешь, как голый output применить?
-
Ega23 © (29.10.08 17:28) [6] голый output выведет список удаленны/измененных/добавленых записей и что с ними делать? Если вставить в таблицу это понятно, можно дальше с ними работать.
-
> голый output выведет список удаленны/измененных/добавленых > записей и что с ними делать? Например: данные в полях могут инициализироваться/изменяться не только на клиенте, а клиенту почти всегда нужно/желательно/... знать актуальные данные.
-
>А если ещё точнее, то это дело в хранимку оборачиваю.
Объясните, плис, зачем создавать хранимую процедуру, если скрипт ниже норм выполняется в adoquery и идентификатор возвращает: Set NoCount ON
insert into table_1(name) values('qwerty')
Select Result = Scope_Identity()
-
есть у некоторых такая мания все подряд в них "оборачивать"... ;)
встречал, в таком солидном с виду продукте... типа CREATE PROCEDURE GetDoc AS SELECT * FROM ViewDoc
и соответственно вьюшка CREATE VIEW ViewDoc AS SELECT * FROM Documents
и права только на использование GetDoc... ни к вьюшке ни к таблице доступа нет по умолчанию, таблица справочник может быть довольно большой, а используют его раз прав нет, понятно как, выборкой всего и фильтрацией на клиенте... что подтвердилось тормозами, когда я туда 5 млн записей нагенерил... (тестю я так программы разные :)
-
kile © (29.10.08 20:47) [9] Допустим у пользователя нет прав вставлять данные в таблицу, а вот именно name только из этой хранимки можно.
-
> есть у некоторых такая мания все подряд в них "оборачивать". > .. ;)
TSQL, в отличие от других, более "вольно" относится к хранимым процедурам. Поэтому ничего не стоит написать хп для работы с сущностью. Типа:
Print 'S_TBLK - процедура для работы с БЛК-блоками'
go
if exists (select * from sysobjects where id = object_id(N'[S_TBLK]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [S_TBLK]
GO
CREATE PROCEDURE S_TBLK
@ActNam varchar(32)='NONE',
@ObjID int=-1,
@ObjOwner int =NULL,
@ObjNam varchar(64)='',
@ObjLab varchar(64)='',
@ObjOrd int =-1,
@ObjMsk tinyint =255,
@ObjNot varchar(255)='',
@ObjStat int =0,
@LogAddr int =-1,
@PhsAddr int =-1,
@SubAddr int =0,
@LogObjID int =NULL,
@PhsCfgTypCod int =NULL,
-- Debug Information
@SelOut int =1,
@Debug int =0
As
declare
@result int,
@ConstCLSID int,
@x int;
Set NoCount ON;
Set @ConstCLSID=31300;
Set @Result=0;
Select @ActNam=RTrim(LTrim(UPPER(@ActNam)));
--------------------------------------------------------------------------------------------------------------
if @ActNam='SEL'
begin
Select *,
ObjMskStr=Case when ObjMsk=0 then 'Нет' else 'Да' end
from BLK
where (@ObjMsk=255 or ObjMsk=@ObjMsk) and (@ObjID=-1 or ObjID=@ObjID)
Order By ObjOrd;
Goto Fin;
end;
--------------------------------------------------------------------------------------------------------------
if @ActNam='ADD'
begin
exec @ObjID=S_RTTIProc @ActNam='GETOBJID.SEL', @CLSID=@ConstCLSID, @ObjID=@ObjID;
-- exec S_LogToPhsLinkProc @ActNam='PHSTOLOG.SET', @ObjID=@ObjID, @LogObjID=@LogObjID output;
Insert into BLK
(ObjID, ObjOwner, ObjNam, ObjLab, ObjOrd, ObjMsk, ObjNot, ObjStat,
LogAddr, PhsAddr, SubAddr, LogObjID, PhsCfgTypCod)
Values (@ObjID, @ObjOwner, @ObjNam, @ObjLab, @ObjOrd, @ObjMsk, @ObjNot, @ObjStat,
@LogAddr, @PhsAddr, @SubAddr, @LogObjID, @PhsCfgTypCod);
exec S_RTTIProc @ActNam='SETPOINTID.UPD', @ObjID=@ObjID, @LogAddr=@LogAddr, @PhsAddr=@PhsAddr;
Select @Result=@ObjID;
if @SelOut=1
begin
Set NoCount OFF;
Select Result=@Result;
end;
Goto Fin;
end;
--------------------------------------------------------------------------------------------------------------
if @ActNam in ('UPD', 'UPDALL')
begin
-- exec S_LogToPhsLinkProc @ActNam='PHSTOLOG.SET', @ObjID=@ObjID, @LogObjID=@LogObjID output;
Update BLK set
ObjNam=@ObjNam, ObjOwner=@ObjOwner, ObjLab=@ObjLab, ObjOrd=@ObjOrd,
ObjMsk=@ObjMsk, ObjNot=@ObjNot, ObjStat=@ObjStat,
LogAddr=@LogAddr, PhsAddr=@PhsAddr, SubAddr=@SubAddr, LogObjID=@LogObjID,
PhsCfgTypCod=@PhsCfgTypCod
where ObjID=@ObjID;
exec S_RTTIProc @ActNam='SETPOINTID.UPD', @ObjID=@ObjID, @LogAddr=@LogAddr, @PhsAddr=@PhsAddr;
Select @Result=@ObjID;
if @SelOut=1
begin
Set NoCount OFF;
Select Result=@Result;
end;
Goto Fin;
end;
--------------------------------------------------------------------------------------------------------------
if @ActNam='DEL'
begin
-- exec S_LogToPhsLinkProc @ActNam='PHSTOLOG.SET', @ObjID=@ObjID, @LogObjID=NULL;
Delete BLK where ObjID=@ObjID;
Delete ObjectClasses where ObjID=@ObjID;
Select @Result=@ObjID;
if @SelOut=1
begin
Set NoCount OFF;
Select Result=@Result;
end;
Goto Fin;
end;
--------------------------------------------------------------------------------------------------------------
fin:
set nocount off;
return(@result);
GO
|