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

Вниз

Параметры 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
3-49395
Wadim
2003-12-19 22:17
2004.01.16
TreeView & БД


1-49561
GooG-NTS
2004-01-06 04:45
2004.01.16
Использование PNG


9-49381
MeF88
2003-07-02 15:18
2004.01.16
Alpha-channel в Direct3D


1-49488
Yuri Btr
2004-01-03 16:05
2004.01.16
Восстановление и минимизация окон


3-49410
Mordsit
2003-12-19 11:34
2004.01.16
SQL-запрос