Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
1-46303
andrew_f
2002-04-02 18:29
2002.04.15
Internal error: U704


3-46269
Roman_tutov@mail.ru
2002-03-25 11:17
2002.04.15
Доступ к DBF для чайника


1-46311
Алекс555
2002-04-03 12:37
2002.04.15
Друзья, подскажите для чего нужны указатели, на простом примере


14-46510
Knight
2002-03-07 14:47
2002.04.15
Материал по теории графов...


1-46379
Death Soul
2002-04-01 22:22
2002.04.15
RTTI при использовании динамических объектов