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

Вниз

Возвращаемой в запросе величине присвоить значение переменной   Найти похожие ветки 

 
yura_2   (2004-03-18 14:55) [0]

Есть проблема. Как присвоить переменной Delphi значение, которое возвращает SQL-T сервера БД?
Имеется запрос:

ADOQuery.SQL.Text:="DECLARE @rez int EXECUTE spDelNaklad, @rez OUTPUT @rez";
ADOQuery.Open;

Переменной @rez присваивается определенное значение в соответсвии с хран. процедурой spDelNaklad. Как передать это значение переменной в Delphi?
Как добиться, чтобы из приложения было видно вообщение SQL-T (print @inf) в аналогичном запросе:

DECLARE @rez int EXECUTE spDelNaklad :id, @rez OUTPUT IF @rez>0 PRINT @inf"
(конечно, @inf имеет определенное значение). Если отработать такой запрос через утилиту SQL Query Analyzer то это сообщение получаем без проблем.


 
stas ©   (2004-03-18 15:24) [1]

Как передать это значение переменной в Delphi?
В AdoQuery SET :PAR =@rez
Параметр нужно настроить как OutPut.


> Как добиться, чтобы из приложения было видно вообщение SQL-T
> (print @inf) в аналогичном запросе:

Событие - AdoConnection.OnInfoMessage + Серверный курсор.


 
yura_2   (2004-03-18 15:52) [2]

To stas:
В AdoQuery так и прописано: @rez OUTPUT (из хр.процедуры возвращается значение - OUTPUT). т.е., если написать:
DECLARE @rez int EXECUTE spDelNaklad @rez OUTPUT IF @rez>0 PRINT @rez
то в SQL Query Analyzer как раз увидим значение этой переменной @rez. Так вот и вопрос, как присвоить переменной Delphi (в приложении) значение возвращаемой в запросе величины @rez. Чтобы потом можно было, к примеру, через ShowMessage(...) сообщить это пользователю.
Насчет: AdoConnection.OnInfoMessage + Сервверный курсор - если можно поподробнее, так мне не понятно.


 
yura_2   (2004-03-18 15:53) [3]

To stas:
В AdoQuery так и прописано: @rez OUTPUT (из хр.процедуры возвращается значение - OUTPUT). т.е., если написать:
DECLARE @rez int EXECUTE spDelNaklad @rez OUTPUT IF @rez>0 PRINT @rez
то в SQL Query Analyzer как раз увидим значение этой переменной @rez. Так вот и вопрос, как присвоить переменной Delphi (в приложении) значение возвращаемой в запросе величины @rez. Чтобы потом можно было, к примеру, через ShowMessage(...) сообщить это пользователю.
Насчет: AdoConnection.OnInfoMessage + Сервверный курсор - если можно поподробнее, так мне не понятно.


 
Yura_2   (2004-03-18 16:18) [4]

Прошу извенить. Спешил и ошибка вышла в строке, в тексте вопроса. Надо читать так:

ADOQuery.SQL.Text:="EXECUTE spDelNaklad @rez OUTPUT";

Bо последней строке с print тоже:

"EXECUTE spDelNaklad @rez OUTPUT IF @rez>0 PRINT @rez"

В исходнике был запрос с параметрами, но они к этому вопросу не относятся. И я не все в строке убрал сразу.


 
Delirium ©   (2004-03-18 18:12) [5]

SET NOCOUNT ON
DECLARE @rez int
EXECUTE spDelNaklad, @rez OUTPUT
SELECT @rez as Result


 
Yura_2   (2004-03-19 09:05) [6]

To Delirium
К сожалению, у меня инет только до 18-ти часов. Поэтому не мог раньше ответить.
Дело в том, что как и "PRINT @rez", так и Ваша последняя сторка из приложения не видны. Поэтому и была идея как-то присвоить результат этого запроса какой-либо переменной Delphi. Чтобы потом можно было потом как-то ее (или его - результат) обработать. Но, видимо, это не правильно. Придется создавать расширенную хранимую процедуру. Если есть у кого какая-то информация, как проще это сделать на Delphi - дайте ссылку


 
stas ©   (2004-03-19 09:14) [7]

Ты немного не понял

ADOQuery.SQL.Text:="EXECUTE spDelNaklad @rez OUTPUT";
ADOQuery.SQL.ADD ("SET :PAR = @rez");
AdoQuery.Parameters[0].Direction:=pdOutPut;
Выполняешь запрос: ADOQuery.ExecSQL;
И дальше пишешь:
A:=AdoQuery.Parameters[0].Value;


 
stas ©   (2004-03-19 09:18) [8]

А чтобы получить результат функции print
нужно:
AdoQuery.Cursorlocation:=clUseServer;
И на событие ADOCONNECTION.ONINFOMESSAGE написать
procedure TForm1.ADOConnection1InfoMessage(Connection: TADOConnection;
 const Error: Error; var EventStatus: TEventStatus);
begin
SHOWMESSAGE (Error.Description);
end;
Помоему так.


 
Delirium ©   (2004-03-19 10:21) [9]

"...так и Ваша последняя сторка из приложения не видны..." - т.е. FieldByName("Result") результат не возвращает? :)


 
Yura_2   (2004-03-19 13:16) [10]

Опять были проблемы со связью. Всем спасибо за помощь.
To Delirium:
В этом варианте
SET NOCOUNT ON
DECLARE @rez int
EXECUTE spDelNaklad, @rez OUTPUT
SELECT @rez as Result

на FieldByName("Result") отвечает, что поле Result не найдено. Не смог разобраться, почему. Мне кажется, что должно бы было получиться.

TO stas:
С вариантом
AdoQuery.Parameters[0].Direction:=pdOutPut;
ругается на шаге ADOQuery.ExecSQL;
Прошел вариант:
Parameters.ParamValues["PAR"]:=pdOutPut;

Сейчас попробую вариант с PRINT


 
Yura_2   (2004-03-19 13:16) [11]

Опять были проблемы со связью. Всем спасибо за помощь.
To Delirium:
В этом варианте
SET NOCOUNT ON
DECLARE @rez int
EXECUTE spDelNaklad, @rez OUTPUT
SELECT @rez as Result

на FieldByName("Result") отвечает, что поле Result не найдено. Не смог разобраться, почему. Мне кажется, что должно бы было получиться.

TO stas:
С вариантом
AdoQuery.Parameters[0].Direction:=pdOutPut;
ругается на шаге ADOQuery.ExecSQL;
Прошел вариант:
Parameters.ParamValues["PAR"]:=pdOutPut;

Сейчас попробую вариант с PRINT


 
Yura_2   (2004-03-19 13:24) [12]

Что-то два ответа сразу получилось. Раз нажал - выдало ошибку, вернулся и отправил еще раз. Теперь - два...


 
stas ©   (2004-03-19 14:33) [13]

Параметры можешь настраивать в DesignTime.


 
Yura_2   (2004-03-19 16:46) [14]

Что у меня не так все это работает.
with ADOQuery_All Do begin
 SQL.Clear;
 SQL.Text:="DECLARE @rez int EXECUTE spDelNaklad :id, @rez  OUTPUT"
 SQL.ADD ("SET :par = @rez");
 Parameters.ParamValues["id"]:=id;
 Parameters[1].Value:=pdOutPut;
//или Parameters.ParamValues["PAR"]:=pdOutPut;
 ExecSQL;
 a:=Parameters[1].Value;


При этом почему-то a = 2 всегда! Если процедуру spDelNaklad запускать из SQL Analizer, то @rez OUTPUT принимает реальные значения (правильные). Запутался в трех строчках.


 
KSergey ©   (2004-03-20 14:14) [15]

1. Прекратите маятся фигней и просто вызовете SP как и положено, указав параметр выходной ;)
2.
> на FieldByName("Result") отвечает, что поле Result не найдено.

Ну так используйте

Query.Fields[0].Value - куда уж проще ;)



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

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

Наверх




Память: 0.51 MB
Время: 0.047 c
8-1072388349
LLL
2003-12-26 00:39
2004.04.18
Графики и прозрачность


1-1080743581
Фдуч
2004-03-31 18:33
2004.04.18
Меню в MDI приложении


1-1080380662
LastLamer
2004-03-27 12:44
2004.04.18
Pointer


1-1080140043
ricks
2004-03-24 17:54
2004.04.18
Методы ActiveX


1-1080937676
KyRo
2004-04-03 00:27
2004.04.18
Удаление файлов