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

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

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

А если ещё точнее, то это дело в хранимку оборачиваю. Но это уже отдельная тема.


Наверх

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