Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-157
Alex Dobrushin
2002-03-18 14:57
2002.04.01
Как показать и распечатать PDF файл?


4-356
Bodia
2002-01-30 19:11
2002.04.01
Как мне изменить иконку программы, из своей?


4-352
Relict
2002-02-01 11:14
2002.04.01
добавление своей строки в системный трей


1-142
Zool
2002-03-21 22:53
2002.04.01
Ошибка


1-209
Evgenyk
2002-03-10 16:35
2002.04.01
Как программно получить данные о версии файла ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский