Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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

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




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.024 c
1-46372           Biorobot              2002-04-01 18:29  2002.04.15  
Как програмно отключить монитор?


1-46377           Swinger               2002-03-29 21:42  2002.04.15  
Размер программы


1-46300           Martyn                2002-04-02 11:27  2002.04.15  
Вопрос по печати Bitmap в Delphi


3-46258           B_A_V                 2002-03-25 09:31  2002.04.15  
что выьрать: Seagate Crystal Reports или XL Report G2?


1-46450           AFROLOV               2002-04-03 11:21  2002.04.15  
Resize форм