Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возвращаемой в запросе величине присвоить значение переменной [D6, MSSQL]


yura_2 ©   (2004-03-18 14:55:00) 

Есть проблема. Как присвоить переменной 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 то это сообщение получаем без проблем.


KSergey   (2004-03-20 14:14:00) [1]

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

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

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


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

Что у меня не так все это работает.
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принимает реальные значения (правильные). Запутался в трех строчках.


stas   (2004-03-19 14:33:00) [3]

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


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

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


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

Опять были проблемы со связью. Всем спасибо за помощь.
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:00) [6]

Опять были проблемы со связью. Всем спасибо за помощь.
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


Delirium   (2004-03-19 10:21:00) [7]

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


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

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


stas   (2004-03-19 09:14:00) [9]

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

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;


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

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


Delirium   (2004-03-18 18:12:00) [11]

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


Yura_2   (2004-03-18 16:18:00) [12]

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

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

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

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

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


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

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:52:00) [14]

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 + Сервверный курсор - если можно поподробнее, так мне не понятно.


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо