Форум: "Базы";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
ВнизD5, MS SQL7 Найти похожие ветки
← →
gimbat (2002-03-25 22:47) [0]Как вернуть в программу на Дельфи какое-нибудь значение или результат из хранимой процедуры.
Например:
Создаю хранимую процедуру:
CREATE PROCEDURE test1
AS return 4
В программе пишу:
datamodule2.ADOQuery1.close;
datamodule2.ADOQuery1.SQL.Text := "exec test1";
label1.caption:=inttostr(datamodule2.ADOQuery1.execsql);
В результате label1 показывает -1
хотя, как мне кажется должно быть 4.
Я что-то делаю не так!
Помогите найти ошибку.
← →
Balu (2002-03-26 00:31) [1]А чем тебе не нравится TADOStoredProc?
← →
.victor (2002-03-26 10:58) [2]Balu абсолютно прав. Только через TADOStoredProc... Можно и через Query, но это из разряда интеллектуального рукоблудия :)
← →
gimbat (2002-03-26 11:48) [3]Спасибо за совет.
Но напишите пример пожалуйста.
Я уже покопался в форуме, и к тому же пришел.
Но у меня все равно что -то не получается.
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"
я понимаю руки кривые, но надоело тыканье пальцем,
ДРУГИ помогите!
← →
asafr (2002-03-26 12:04) [4]Так не соотаетствие типов String (label1.caption) и Parameters.ParamByName("@N").Value
← →
gimbat (2002-03-26 12:37) [5]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."
← →
Johnmen (2002-03-26 12:43) [6]И причем здесь Open ???!!! (ExecSQL)
← →
asafr (2002-03-26 13:00) [7]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;
← →
asafr (2002-03-26 13:04) [8]Johnmen, почему ExecSQL обязательно? Может ему Open нужно... И если ADOStoredProc1 -> ADOStoredProc1.ExecProc;
← →
Johnmen (2002-03-26 13:16) [9]Судя по вопросу, Open не нужно...
А вот ExecProc - это верно !
← →
Shirson (2002-03-26 13:21) [10]>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) [11]Я то думаю, что Open нужно. Если я что-то понял, то он хочет возвратить значение Parameters.ParamByName("@N").Value, а ExecProc не возвращает значения...
← →
Shirson (2002-03-26 13:34) [12]А вы бы хелп открыли и посмотрели, чем Open отличается от ExecSQL или ExecProc, а то флейму нагородили :)
← →
gimbat (2002-03-26 13:36) [13]Спасибо Shirson"у!!!
Все работает.
Чтобы остальным было ясно что я хотел узнать,
объясняю нужен был работающий пример передачи какого-либо значения из хранимой процедуры в дельфийскую прогу...
Прошу у всех прощения, если кого-то ввел в заблуждение.
Если есть варианты как то же самое (пример от Shirson"а) реализовать через TADOStoredProc, буду очень признателен.
Всем спасибо.
← →
asafr (2002-03-26 13:51) [14]Дык, Shirson, зачем в хелп лезть, чтобы понять, чем ExecSQL отличается от ExecProc?
Как я понял, ты все сделал через ADOQuery1? На мой взгляд это не совсем правильно. Кстати, мой вариант, если он возвращает одно значение - вполне рабочий.
← →
Shirson (2002-03-26 13:52) [15]Хм... я с TADOStoredProc не связывался... но что-то мне подсказывает, что заменив ADOQuery1 на ADOStoredProc1 получим тот же самый результат :) Конечно, нужно заполнить ProcedureName именем процедуры, а данные вытаскивать через ADOStoredProc1["ret"] - и квери и процедурина пляшут от общего предка - должно сработать.
← →
asafr (2002-03-26 14:03) [16]Верно, результат получим тот же, но скорость выборки при использовании ADOStoredProc будет раза в два повыше... Поэкспериментируй...
← →
Shirson (2002-03-26 14:05) [17]>asafr "Как я понял, ты все сделал через ADOQuery1? На мой взгляд это не совсем правильно. "
:) Оно работатет? Да. Оно нарушает логику программинга? Нет. Так какие проблемы? ;))))
То что я TADOStoredProc не пользую, так могу сказать почему - смысла не вижу. Узкоспециализированная фигня неизвестного назначения. Как и TADOTable. и Комманд. Для меня есть две главных компоненты - Коннекшн и Квери. Ими я решаю все задачи ни чуть не задумываясь или напрягаясь. Кроме того, каждая кверина у меня используется по нескольку раз в разных местах. Сейчас я из нее селект сделал, следующим шагом процедуру прогнал, потом заинсертил что-то, потом опять селект, потом апдейт, еще процедура и т.д. Зачем я буду набрасывать кучу компонент, когда всё это можно сделать одной? Квери дает полную свободу SQL, а мне именно это и нужно.
IMHO, конечно же. Я никому не навязываю своего стиля, но и не соглашусь что он неверен (дай бог банк пока работает.. и не один год и без единого сбоя :) )
← →
asafr (2002-03-26 14:22) [18]Дык, Shirson, разьве я против? Я и сам часто использую Query (только, упаси меня от разного рода TTable, ADOTable - в этом поддерживаю тебя на все 100%). И мой ответ от (26.03.02 14:03) ни в коем случае не было попыткой "поучить" тебя. Мне самому надо еще учиться и учиться в очень многом... Ну, ты меня извини, если я вдруг каким-то образом тебя "задел" или обидел...
← →
Shirson (2002-03-26 15:16) [19]>asafr
Без проблем :) Я не обиделся, просто некоторые мои мульки вызывают у людей стойкую мысль - "не по правилам!!!!" Я привык :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c