![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Параметры IBStoredProc [D6, IB6.x]
Sirruf © (2003-12-16 19:40:00)
На сервере есть большое количество хранимых процедур. Я использую для них один компонент IBStoredProc (IBX), динамически меняю свойство StoredProcName, затем пишу
UnPrepare;
ParamByName("...") := XXX;
..........................
Prepare;
ExecProc;
Процедуры должны вставлять данные в таблицу, однако этого не происходит. Вопрос: нужно ли динамически создавать параметры в IBStoredProc или они все-таки генерятся автоматически? И как в этом случае быть с UnPrepare..Prepare? Куски кода приветствуются.
Vemer (2003-12-17 17:00:00) [1]
Вариант - сгруппировать все ХП в несколько или одну и вызывать по номеру, как функции (через доп. параметр).
Johnmen (2003-12-17 14:26:00) [2]
1. Unprepare;
2. StoredProcName := "GETPROCESSORID";
3. Prepare;
4. ParamByName....
5. ExecProc;
...
Sirruf (2003-12-17 14:21:00) [3]
Проще говоря, Unprepare убрать вместе с Prepare на фиг, правильно я понял?
Компонент GetIDProc каждый раз привязывается к новой хранимой процедуре посредством изменения его свойства StoredProcName. Чтобы указать типы параметров, нужно их создать, что-то вроде GetIDProc.Params.CreateParam, так ведь? У меня сомнения в том, создаются ли эти параметры автоматически в GetIDProc или их надо вручную создавать с помощью CreateParam?
Johnmen (2003-12-17 14:12:00) [4]
>Sirruf © (17.12.03 14:07)
1. Про Unprepare; уже говорили.
2. Нигде не указаны типы параметров.
Sirruf (2003-12-17 14:07:00) [5]
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 13:56:00) [6]
Как осуществляется вызов сей процедуры ? Код ?
Sirruf (2003-12-17 13:43:00) [7]
Дело в том, что при вставке записи, моя процедура возвращает в выходном параметре 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
Жук (2003-12-17 13:35:00) [8]
Предлагаю заменить "IBStoredProc" на "IBSQL" с соответствующим запросом.
Sirruf (2003-12-17 13:33:00) [9]
Сменить машину в данном случае означает переход на другой компилятор. А пробитое колесо - это ИМХО TIBStored, с которым надо что-то решать.
Commit делаю, данные не вставляются, хотя и ошибку не выдает.
Johnmen (2003-12-17 13:07:00) [10]
Если едешь на машине и чувствуешь, что какое-то колесо "бьёт", то не приходит в голову сменить машину ?
:)
Sirruf (2003-12-17 12:53:00) [11]
В статье http://www.ibase.ru/devinfo/ibstp.htmясно сказано о глючности TIBStoredProc. Вот это меня и подвигло к таким поползновениям.
Johnmen (2003-12-17 12:43:00) [12]
>Sirruf © (17.12.03 12:39)
Что за странные поползновения ? Может сразу на ADO ??? :)
Sirruf (2003-12-17 12:39:00) [13]
А что, если переделать под dbExpress или BDE? В этом случае нужно делать StoredProc1.Params.CreateParam или нет?
Vemer (2003-12-17 11:53:00) [14]
Вариант - объединить процедуры в несколько и вызывать с указанием "номера функции" в параметре.
Zacho (2003-12-16 21:14:00) [15]
Вот пример их хелпа.
{ 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 не делаешь.
Rad (2003-12-16 21:13:00) [16]
Кстати, TIBStoredProc - вещь очень странная и непредсказуемая.
Мне лично, правда, с ним почти не пришлось работать - но вот гораздо более авторитетные люди даже статью написали по этому поводу: http://www.ibase.ru/devinfo/ibstp.htm
____Nikolay (2003-12-16 21:01:00) [17]
Я использовал FIB там все нормально, параметры автоматически создаются