Форум: "Базы";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
ВнизКак правильно получить результат выполнения хранимой процедуры с выходными параметрами!!! Найти похожие ветки
← →
vasilly (2002-03-06 08:48) [0]Имеется связка Delphi+BDE+MS SQL7, на сервере лежит хранимая процедура с выходными параметрами, когда из дельфи пытаешься ее выполнить оан ничего не делает и возвращает результат отличноый от результата получаемого в QueryAnalyzer. Описание ниже.
Имеется хранимая процедура:
CREATE PROCEDURE [sp_SetNextO_Num]
(@CreateDate [datetime], @O_Num [int] OUT, @O_Date [datetime] OUT)
AS
begin
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
set nocount on
select @O_Num = Max(O_Num)+1 from TAB1 TABLOCKX HOLDLOCK where year(O_Date) = year(@CreateDate)
select @O_Date = @CreateDate
UPDATE [TAB1] SET [O_Num] = @O_Num, [O_Date ]= @O_Date WHERE ([O_Num] = 0 and [O_Date]=@CreateDate)
select @O_Num, @O_Date
COMMIT TRANSACTION
end
Когда запускаешь на выполнение с QueryAnalyzer слудуюцие строки:
declare @O_Num int
declare @O_Date datetime
exec sp_SetNextO_Num "05.03.2002 22:13:47", @O_Num, @O_Date
то получается результат:
----------- ---------------------------
1 2002-05-03 22:13:47.000
Когда пытаешься выполнить это же из дельфи:
StoredProc1.Params.Clear;
StoredProc1.StoredProcName:= "sp_SetNextO_Num";
StoredProc1.Params.CreateParam(ftDateTime, "@CreateDate", ptInput);
StoredProc1.Params.CreateParam(ftInteger, "@O_Num", ptOutput);
StoredProc1.Params.CreateParam(ftDateTime, "@O_Date", ptOutput);
StoredProc1.ParamByName("@CreateDate").AsDateTime:= StrToDateTime( Edit1.Text);
StoredProc1.ExecProc;
Edit2.Text := StoredProc1.ParamByName("@O_Num").AsString;
она валится на возвращении результата, потому что результат приходит почему то 0 для O_Num и 0.0 для O_Date, соответственно при переводе 0.0 не валидный timestamp...но это не главное, главное не возвращается результат.
Вопрос: как добится возвращения реальных результатов? а не 0.
← →
boogier (2002-03-06 09:42) [1]Может быть так?
COMMIT TRANSACTION
select @O_Num, @O_Date
end
← →
vasilly (2002-03-06 09:53) [2]наверное все таки нет, потому что QueryAnalyzer возвращает результат номально...прочти текст процедуры внимательно
← →
MetallAdm (2002-03-06 10:04) [3]Ну вот такой пример !
if exists (select * from sysobjects where id = object_id("dbo.MyProcedure") and sysstat & 0xf = 4)
drop procedure dbo.MyProcedure
GO
CREATE PROCEDURE MyProcedure
@s varchar(100) output,
@dd int
AS
select @s=""
If @dd >0
begin
select @s = "Пример !!!"
return
end
GO
А вот попробуй запустить ентот скрипт
declare @s VarChar(100)
exec MyProcedure @s output,3
select @s
← →
vasilly (2002-03-06 10:09) [4]ну?? в QueryAnalyzer"е он проходит...
а как это сделать в Дельфи?
← →
MetallAdm (2002-03-06 10:15) [5]declare @O_Num int
declare @O_Date datetime
exec sp_SetNextO_Num "05.03.2002 22:13:47", @O_Num OUTPUT, @O_Date OUTPUT
попробуй так если output не прокатит попробуй OUT
← →
vasilly (2002-03-06 10:16) [6]т.е. ты имеешь ввиду
в TQuery запихать эту текстовуху?
← →
Alex G u e s t (2002-03-06 10:17) [7]Уберите в тексте процедуры строку
select @O_Num, @O_Date
Вам ведь надо вернуть только эти значения, а не Dataset?
А именно это Вы делаете последним select"ом.
При таком написании посмотрите, что будет лежать в
StoredProc1.FieldByName("@O_Num").AsString
← →
vasilly (2002-03-06 10:21) [8]ок, проверю...(но я думаю это врядли поможет)
я читал что даже в случае датасета, хранимая процедура возврщает одну строку, если кол-во записей больше...то нужно использовать курсор
← →
MetallAdm (2002-03-06 10:24) [9]i:=OTCGroup.ItemIndex;
DM.QFirm.Close;
DM.QFirm.SQL.Clear;
DM.QFirm.SQL.Add("Exec SelectFirm :i");
DM.QFirm.Params[0].AsInteger:=i;
DM.QFirm.EXEcSql;
Result:= DM.QFirm.Params[0].AsInteger;
помойму так но я ентот пример от балдны написал уже непомню
верон это или нет
← →
vasilly (2002-03-06 10:43) [10]Ага, через TQuery я не пробывал...надо проверить, может нахаляву и получится
← →
Python_kaa (2002-03-06 10:59) [11]Вот подсказка из дельфевого хелпа.
Tip: If an application is only interested in the result set returned
by a stored procedure, call StoredProc.Open or set its Active property
to True.
Т.е. Если ты хочешь получить выходящий результат, то используй Open
вместо ExecProc. Собственно как и в Query.
← →
vasilly (2002-03-06 11:17) [12]ок...
как подсказал Alex G u e s t, Python_kaa нельзя использовать ExecProc для Датасета...
если исправить ХП так:
CREATE PROCEDURE [sp_SetNextO_Num]
(@CreateDate [datetime], @O_Num [int] OUT, @O_Date [datetime] OUT)
AS
begin
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
set nocount on
select @O_Num = Max(O_Num)+1 from TAB1 TABLOCKX HOLDLOCK where year(O_Date) = year(@CreateDate)
select @O_Date = @CreateDate
UPDATE [TAB1] SET [O_Num] = @O_Num, [O_Date ]= @O_Date WHERE ([O_Num] = 0 and [O_Date]=@CreateDate)
--select @O_Num, @O_Date
COMMIT TRANSACTION
end
то все будет работать!
насчет Open не проверял...но думаю что тоже будет работать
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c