Форум: "Базы";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.125 c