Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
4-46543
skywalker
2002-02-14 14:01
2002.04.15
Как получить список запущенных приложений?


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


1-46410
Bilya
2002-04-02 13:41
2002.04.15
Список импортируемых функций!!!!


3-46276
Stranger
2002-03-25 16:01
2002.04.15
Хранение файлов различных типов в полях БД MS SQL Server


3-46215
Dimonka
2002-03-22 14:18
2002.04.15
Вопрос по структуре БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский