![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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?