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

Вниз

Как правильно получить результат выполнения хранимой процедуры с выходными параметрами!!!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
1-119
Aleksandr
2002-03-21 14:49
2002.04.01
Как защитить переменные в потоке?


1-194
sammy
2002-03-19 09:33
2002.04.01
Про trial-version


1-123
Mikhail
2002-03-20 18:37
2002.04.01
Как отуродовать окошко Hint a


3-59
Vks
2002-03-07 10:46
2002.04.01
Paradox при некорректном завершении теряет данные


6-258
greenrul
2002-01-17 18:49
2002.04.01
Как убрать scrollbar ы у WebBrowser?