Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.02;
Скачать: CL | DM;

Вниз

sql server, оператор output и adoDataSet   Найти похожие ветки 

 
kile ©   (2008-10-28 22:08) [0]

подскажите, кто по опотнее

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-29 13:48) [1]


> 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

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


 
Anatoly Podgoretsky ©   (2008-10-29 16:27) [2]

Это синтаксис 2005, зато inserted.id это не скаляр и вся конструкция по сути является ошибкой.


 
stas ©   (2008-10-29 17:07) [3]

kile ©   (28.10.08 22:08)
Интересно ты придумал получать ID, лучше как в Ega23 ©   (29.10.08 13:48) [1]

Ega23 ©   (29.10.08 13:48) [1]
OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю где и применить можно.


 
Ega23 ©   (2008-10-29 17:26) [4]


> OUTPUT INTO иногда даже полезна, просто OUTPUT даже незнаю
> где и применить можно.


Ты сам себе противоречишь....  :)))


 
stas ©   (2008-10-29 17:27) [5]

Ega23 ©   (29.10.08 17:26) [4]
Почему ? :)


 
Ega23 ©   (2008-10-29 17:28) [6]

Или ты не знаешь, как голый output применить?


 
stas ©   (2008-10-29 17:34) [7]

Ega23 ©   (29.10.08 17:28) [6]
голый output выведет список удаленны/измененных/добавленых записей и что с ними делать?
Если вставить в таблицу это понятно, можно дальше с ними работать.


 
b z   (2008-10-29 18:00) [8]


> голый output выведет список удаленны/измененных/добавленых
> записей и что с ними делать?
Например: данные в полях могут инициализироваться/изменяться не только на клиенте, а клиенту почти всегда нужно/желательно/... знать актуальные данные.


 
kile ©   (2008-10-29 20:47) [9]


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


Объясните, плис, зачем создавать хранимую процедуру, если скрипт ниже норм выполняется в adoquery и идентификатор возвращает:

Set NoCount ON
insert into table_1(name) values("qwerty")
Select Result = Scope_Identity()


 
sniknik ©   (2008-10-29 21:52) [10]

есть у некоторых такая мания все подряд в них "оборачивать"... ;)

встречал, в таком солидном с виду продукте...  типа
CREATE PROCEDURE GetDoc
AS
 SELECT * FROM ViewDoc

и соответственно вьюшка
CREATE VIEW ViewDoc
AS
 SELECT * FROM Documents

и права только на использование GetDoc... ни к вьюшке ни к таблице доступа нет по умолчанию, таблица справочник может быть довольно большой, а используют его раз прав нет, понятно как, выборкой всего и фильтрацией на клиенте... что подтвердилось тормозами, когда я туда 5 млн записей нагенерил... (тестю я так программы разные :)


 
stas ©   (2008-10-30 08:52) [11]

kile ©   (29.10.08 20:47) [9]
Допустим у пользователя нет прав вставлять данные в таблицу, а вот именно name только из этой хранимки можно.


 
Ega23 ©   (2008-10-30 12:15) [12]


> есть у некоторых такая мания все подряд в них "оборачивать".
> .. ;)


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




Страницы: 1 вся ветка

Текущий архив: 2009.08.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
11-1204274900
andreil
2008-02-29 11:48
2009.08.02
Проблема с добавлением форм :(


2-1244472613
lewka
2009-06-08 18:50
2009.08.02
Работа в Word


15-1239181215
Cobalt
2009-04-08 13:00
2009.08.02
Альтернатива Indy? (D 2007)


2-1244092170
Gans
2009-06-04 09:09
2009.08.02
Вызов хранимой процедуры


2-1244381829
anvolkov
2009-06-07 17:37
2009.08.02
Многократно копировать форму в MDI приложении