Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Вниз

Параметры IBStoredProc   Найти похожие ветки 

 
Sirruf   (2003-12-16 19:40) [0]

На сервере есть большое количество хранимых процедур. Я использую для них один компонент IBStoredProc (IBX), динамически меняю свойство StoredProcName, затем пишу
UnPrepare;
ParamByName("...") := XXX;
..........................
Prepare;
ExecProc;
Процедуры должны вставлять данные в таблицу, однако этого не происходит. Вопрос: нужно ли динамически создавать параметры в IBStoredProc или они все-таки генерятся автоматически? И как в этом случае быть с UnPrepare..Prepare? Куски кода приветствуются.


 
____Nikolay   (2003-12-16 21:01) [1]

Я использовал FIB там все нормально, параметры автоматически создаются


 
Rad   (2003-12-16 21:13) [2]

Кстати, TIBStoredProc - вещь очень странная и непредсказуемая.
Мне лично, правда, с ним почти не пришлось работать - но вот гораздо более авторитетные люди даже статью написали по этому поводу: http://www.ibase.ru/devinfo/ibstp.htm


 
Zacho   (2003-12-16 21:14) [3]

Вот пример их хелпа.

{ Set all input parameters to an empty string }

with IBStoredProc1 do
for I := 0 to ParamCount - 1 do
if (Params[I].ParamType = ptInput) or
(Params[I].ParamType = ptInputOutput) then
Params[I].AsString := "";

UnPrepare перед присвоением параметров и Prepare после - не нужен, и даже вреден.
А если у тебя процедура не работает - или ошибка в процедуре, или Commit не делаешь.


 
Vemer   (2003-12-17 11:53) [4]

Вариант - объединить процедуры в несколько и вызывать с указанием "номера функции" в параметре.


 
Sirruf   (2003-12-17 12:39) [5]

А что, если переделать под dbExpress или BDE? В этом случае нужно делать StoredProc1.Params.CreateParam или нет?


 
Johnmen   (2003-12-17 12:43) [6]

>Sirruf © (17.12.03 12:39)

Что за странные поползновения ? Может сразу на ADO ??? :)


 
Sirruf   (2003-12-17 12:53) [7]

В статье http://www.ibase.ru/devinfo/ibstp.htm ясно сказано о глючности TIBStoredProc. Вот это меня и подвигло к таким поползновениям.


 
Johnmen   (2003-12-17 13:07) [8]

Если едешь на машине и чувствуешь, что какое-то колесо "бьёт", то не приходит в голову сменить машину ?
:)


 
Sirruf   (2003-12-17 13:33) [9]

Сменить машину в данном случае означает переход на другой компилятор. А пробитое колесо - это ИМХО TIBStored, с которым надо что-то решать.
Commit делаю, данные не вставляются, хотя и ошибку не выдает.


 
Жук   (2003-12-17 13:35) [10]

Предлагаю заменить "IBStoredProc" на "IBSQL" с соответствующим запросом.


 
Sirruf   (2003-12-17 13:43) [11]

Дело в том, что при вставке записи, моя процедура возвращает в выходном параметре ID вставленной записи, который потом используется в программе.

CREATE PROCEDURE GETPROCESSORID (
IN_PRODUCER VARCHAR(10),
IN_MODEL VARCHAR(20),
IN_FREQUENCY INTEGER)
RETURNS (
OUT_ID SMALLINT)
AS
DECLARE VARIABLE PROCID INTEGER;
begin
select ID from Processors
where (PRODUCER = :in_producer) and (MODEL = :in_model) and (FREQUENCY = :in_frequency)
into :ProcID;
if (not :ProcID is null) then
Out_ID = :ProcID;
else /* if :ProcID is null */
begin
ProcID = gen_id(gen_processors, 1);
insert into Processors values
(:ProcID, :in_producer, :in_model, :in_frequency);
Out_ID = :ProcID;
end
suspend;
end


 
Johnmen   (2003-12-17 13:56) [12]

Как осуществляется вызов сей процедуры ? Код ?


 
Sirruf   (2003-12-17 14:07) [13]

var
Producer, Model: String;
Freqeuncy: Integer;
with dmData.GetIDProc do {GetIDProc-имя компонента IBStoredProc}
begin
StoredProcName := "GETPROCESSORID";
Unprepare;
try
ParamByName("In_Producer").Value := Producer;
ParamByName("In_Model").Value := Model;
ParamByName("In_Frequency").Value := Frequency;
Prepare;
ExecProc;
ProcID := ParamByName("Out_ID").AsSmallint;
except
ProcID := 0;
end; {except}
end; {with}


 
Johnmen   (2003-12-17 14:12) [14]

>Sirruf © (17.12.03 14:07)

1. Про Unprepare; уже говорили.
2. Нигде не указаны типы параметров.


 
Sirruf   (2003-12-17 14:21) [15]

Проще говоря, Unprepare убрать вместе с Prepare на фиг, правильно я понял?
Компонент GetIDProc каждый раз привязывается к новой хранимой процедуре посредством изменения его свойства StoredProcName. Чтобы указать типы параметров, нужно их создать, что-то вроде GetIDProc.Params.CreateParam, так ведь? У меня сомнения в том, создаются ли эти параметры автоматически в GetIDProc или их надо вручную создавать с помощью CreateParam?


 
Johnmen   (2003-12-17 14:26) [16]

1. Unprepare;
2. StoredProcName := "GETPROCESSORID";
3. Prepare;
4. ParamByName....
5. ExecProc;
...


 
Vemer   (2003-12-17 17:00) [17]

Вариант - сгруппировать все ХП в несколько или одну и вызывать по номеру, как функции (через доп. параметр).



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.009 c
7-49788
MakNik
2003-11-03 09:33
2004.01.16
Помогите, пожалуйста, разобраться с сервисами!


3-49443
Grokhem
2003-12-18 11:11
2004.01.16
Приколы с TTable


1-49621
Shutov
2004-01-05 08:05
2004.01.16
Библиотека qtintf70.dll


1-49482
anti256
2003-12-23 18:21
2004.01.16
PChar


1-49490
YuN
2004-01-02 04:38
2004.01.16
Как проще всего поддерживать проект на разных языках?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский