![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
sql server, оператор output и adoDataSet [D7, MSSQL]
kile © (2008-10-28 22:08:00)подскажите, кто по опотнее
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: "Ошибка подключения"
Что может быть?
Ega23 (2008-10-30 12:15:00) [1]
> есть у некоторых такая мания все подряд в них "оборачивать".
> .. ;)
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
stas (2008-10-30 08:52:00) [2]kile © (29.10.08 20:47) [9]
Допустим у пользователя нет прав вставлять данные в таблицу, а вот именно name только из этой хранимки можно.
sniknik (2008-10-29 21:52:00) [3]есть у некоторых такая мания все подряд в них "оборачивать"... ;)
встречал, в таком солидном с виду продукте... типа
CREATE PROCEDURE GetDoc
AS
SELECT * FROM ViewDoc
и соответственно вьюшка
CREATE VIEW ViewDoc
AS
SELECT * FROM Documents
и права только на использование GetDoc... ни к вьюшке ни к таблице доступа нет по умолчанию, таблица справочник может быть довольно большой, а используют его раз прав нет, понятно как, выборкой всего и фильтрацией на клиенте... что подтвердилось тормозами, когда я туда 5 млн записей нагенерил... (тестю я так программы разные :)
kile (2008-10-29 20:47:00) [4]
>А если ещё точнее, то это дело в хранимку оборачиваю.
Объясните, плис, зачем создавать хранимую процедуру, если скрипт ниже норм выполняется в adoquery и идентификатор возвращает:
Set NoCount ON
insert into table_1(name) values('qwerty')
Select Result = Scope_Identity()
b z (2008-10-29 18:00:00) [5]
> голый output выведет список удаленны/измененных/добавленых
> записей и что с ними делать?
Например: данные в полях могут инициализироваться/изменяться не только на клиенте, а клиенту почти всегда нужно/желательно/... знать актуальные данные.
stas (2008-10-29 17:34:00) [6]Ega23 © (29.10.08 17:28) [6]
голый output выведет список удаленны/измененных/добавленых записей и что с ними делать?
Если вставить в таблицу это понятно, можно дальше с ними работать.
Ega23 (2008-10-29 17:28:00) [7]Или ты не знаешь, как голый output применить?
stas (2008-10-29 17:27:00) [8]Ega23 © (29.10.08 17:26) [4]
Почему ? :)
Ega23 (2008-10-29 17:26:00) [9]
> OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю
> где и применить можно.
Ты сам себе противоречишь.... :)))
stas (2008-10-29 17:07:00) [10]kile © (28.10.08 22:08)
Интересно ты придумал получать ID, лучше как в Ega23 © (29.10.08 13:48) [1]
Ega23 © (29.10.08 13:48) [1]
OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю где и применить можно.
Anatoly Podgoretsky (2008-10-29 16:27:00) [11]Это синтаксис 2005, зато inserted.id это не скаляр и вся конструкция по сути является ошибкой.
Ega23 (2008-10-29 13:48:00) [12]
> 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
А если ещё точнее, то это дело в хранимку оборачиваю. Но это уже отдельная тема.