Форум: "Базы";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизВозвращаемой в запросе величине присвоить значение переменной Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c