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

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

D5, MS SQL7 [D5, MSSQL]


gimbat ©   (2002-03-25 22:47:00) 

Как вернуть в программу на Дельфи какое-нибудь значение или результат из хранимой процедуры.

Например:
Создаю хранимую процедуру:

CREATE PROCEDURE test1
AS return 4


В программе пишу:
datamodule2.ADOQuery1.close;
datamodule2.ADOQuery1.SQL.Text := "exec test1";
label1.caption:=inttostr(datamodule2.ADOQuery1.execsql);
В результате label1 показывает -1
хотя, как мне кажется должно быть 4.

Я что-то делаю не так!
Помогите найти ошибку.


Shirson   (2002-03-26 15:16:00) [1]

>asafr

Без проблем :) Я не обиделся, просто некоторые мои мульки вызывают у людей стойкую мысль - "не по правилам!!!!" Я привык :)


asafr   (2002-03-26 14:22:00) [2]

Дык, Shirson, разьве я против? Я и сам часто использую Query (только, упаси меня от разного рода TTable, ADOTable - в этом поддерживаю тебя на все 100%). И мой ответ от (26.03.02 14:03) ни в коем случае не было попыткой "поучить" тебя. Мне самому надо еще учиться и учиться в очень многом... Ну, ты меня извини, если я вдруг каким-то образом тебя "задел" или обидел...


Shirson   (2002-03-26 14:05:00) [3]

>asafr "Как я понял, ты все сделал через ADOQuery1? На мой взгляд это не совсем правильно. "

:) Оно работатет? Да. Оно нарушает логику программинга? Нет. Так какие проблемы? ;))))
То что я TADOStoredProc не пользую, так могу сказать почему - смысла не вижу. Узкоспециализированная фигня неизвестного назначения. Как и TADOTable. и Комманд. Для меня есть две главных компоненты - Коннекшн и Квери. Ими я решаю все задачи ни чуть не задумываясь или напрягаясь. Кроме того, каждая кверина у меня используется по нескольку раз в разных местах. Сейчас я из нее селект сделал, следующим шагом процедуру прогнал, потом заинсертил что-то, потом опять селект, потом апдейт, еще процедура и т.д. Зачем я буду набрасывать кучу компонент, когда всё это можно сделать одной? Квери дает полную свободу SQL, а мне именно это и нужно.
IMHO, конечно же. Я никому не навязываю своего стиля, но и не соглашусь что он неверен (дай бог банк пока работает.. и не один год и без единого сбоя :) )


asafr   (2002-03-26 14:03:00) [4]

Верно, результат получим тот же, но скорость выборки при использовании ADOStoredProc будет раза в два повыше... Поэкспериментируй...


Shirson   (2002-03-26 13:52:00) [5]

Хм... я с TADOStoredProc не связывался... но что-то мне подсказывает, что заменив ADOQuery1 на ADOStoredProc1 получим тот же самый результат :) Конечно, нужно заполнить ProcedureName именем процедуры, а данные вытаскивать через ADOStoredProc1["ret"] - и квери и процедурина пляшут от общего предка - должно сработать.




asafr   (2002-03-26 13:51:00) [6]

Дык, Shirson, зачем в хелп лезть, чтобы понять, чем ExecSQL отличается от ExecProc?
Как я понял, ты все сделал через ADOQuery1? На мой взгляд это не совсем правильно. Кстати, мой вариант, если он возвращает одно значение - вполне рабочий.


gimbat   (2002-03-26 13:36:00) [7]

Спасибо Shirson"у!!!
Все работает.
Чтобы остальным было ясно что я хотел узнать,
объясняю нужен был работающий пример передачи какого-либо значения из хранимой процедуры в дельфийскую прогу...
Прошу у всех прощения, если кого-то ввел в заблуждение.
Если есть варианты как то же самое (пример от Shirson"а) реализовать через TADOStoredProc, буду очень признателен.
Всем спасибо.


Shirson   (2002-03-26 13:34:00) [8]

А вы бы хелп открыли и посмотрели, чем Open отличается от ExecSQL или ExecProc, а то флейму нагородили :)


Shirson   (2002-03-26 13:21:00) [9]

>gimbat
"CREATE PROCEDURE test1
AS return 4

В программе пишу:
datamodule2.ADOQuery1.close;
datamodule2.ADOQuery1.SQL.Text := "exec test1";
label1.caption:=inttostr(datamodule2.ADOQuery1.execsql);
"


Жуть какая :))))


СREATE PROCEDURE test1
AS
Select "Write here What U Want To Return" as Ret

datamodule2.ADOQuery1.close;
datamodule2.ADOQuery1.SQL.Text := "exec test1";
datamodule2.ADOQuery1.Open
label1.caption:=datamodule2.ADOQuery1["ret"];



Все. Если нужно возвращать переменные или прочую муру, пиши

Select @Vari as Ret


asafr   (2002-03-26 13:21:00) [10]

Я то думаю, что Open нужно. Если я что-то понял, то он хочет возвратить значение Parameters.ParamByName("@N").Value, а ExecProc не возвращает значения...


Johnmen   (2002-03-26 13:16:00) [11]

Судя по вопросу, Open не нужно...
А вот ExecProc - это верно !


asafr   (2002-03-26 13:04:00) [12]

Johnmen, почему ExecSQL обязательно? Может ему Open нужно... И если ADOStoredProc1 -> ADOStoredProc1.ExecProc;


asafr   (2002-03-26 13:00:00) [13]

with Datamodule2.ADOStoredProc1 do
begin
try
if active then close;
ProcedureName:="test1";
Parameters.ParseSQL("Exec test1 :@N output",True);
Open;
label1.caption := inttostr(Parameters.ParamByName("@N").Value);
except
close
end;
end;


Johnmen   (2002-03-26 12:43:00) [14]

И причем здесь Open ???!!! (ExecSQL)


gimbat   (2002-03-26 12:37:00) [15]

with Datamodule2.ADOStoredProc1 do
begin
try
if active then close;
ProcedureName:="test1";
Parameters.ParseSQL("Exec test1 :@N output",True);
Open; {до этой ошибки возникает еще одна ошибка, смотри ниже}
except
close
end;
label1.caption := inttostr(Parameters.ParamByName("@N").Value);{здесь подправил, наверное правильно}
end;

Ошибка:
"Project sbyt_f.exe raised exception class EOleException with message
"Parameter object is improperly defined. Inconsistent or incomplete information
was provided". Process stopped. Use step step or run to continue."


asafr   (2002-03-26 12:04:00) [16]

Так не соотаетствие типов String (label1.caption) и Parameters.ParamByName("@N").Value


gimbat   (2002-03-26 11:48:00) [17]

Спасибо за совет.
Но напишите пример пожалуйста.
Я уже покопался в форуме, и к тому же пришел.
Но у меня все равно что -то не получается.

MSSQQL7

CREATE PROCEDURE test1 (@N int output)
AS select @N=3


кусок из программы

with Datamodule2.ADOStoredProc1 do
begin
try
if active then close;
ProcedureName:="test1";
Parameters.ParseSQL("Exec test1 :@N output",True);
Open;
except
close
end;
label1.caption := Parameters.ParamByName("@N").Value;
end;



Возникает ошибка:"Invalid variant type conversion"

я понимаю руки кривые, но надоело тыканье пальцем,
ДРУГИ помогите!


.victor   (2002-03-26 10:58:00) [18]

Balu абсолютно прав. Только через TADOStoredProc... Можно и через Query, но это из разряда интеллектуального рукоблудия :)


Balu   (2002-03-26 00:31:00) [19]

А чем тебе не нравится TADOStoredProc?


Наверх

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