Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не выполняется insert в ХП, вызываемой из клиентского приложения [D6, IB6.x]


Страницы:   1 2

Calm ©   (2002-12-17 12:55:00) 

Имеется хранимая процедура, которая выполняется два основных действия:
1. Добавляет в таблицу запись
2. Делает выборку.
В IBExpert процедура работает отлично.

В клиенстком приложении беру компонент MyDS:TpFIBDataSet и в SQLs.SelectSQL пишу очень простой запросец:
select * from MyStoredProc(:prm1, :prm2);
Компонент говорит, что SQL правильный ("SQL is correct")
Естественно, у компонента установлены свойства DataBase и DefaultTransaction.

Что выполнить требующеся действие делаю так:
MyDS.close;
MyDS.ParamByName("prm1").As..// присваиваю параметрам значения
Значения присваиваются вполне правильные, т.к. эти же параметры отлично проходят, если вызвать ХП из IBExpert"а.
Далее
MyDS.Open;

Процедура возвращает выборку. Причем правильно. Значение генератора ID таблицы, в которую добавляется запись инкрементируется (правильно!). Но... запись в таблицу не добавляется. Почему?

Заранее спасибо за советы

Использую FIBPlus 4.7


Johnmen   (2002-12-17 13:54:00) [21]

CommitRetaining


Calm   (2002-12-17 13:51:00) [22]

Спасибо.
А ссылочку, я конечно, проглядел - скопировал неглядя


Fareader   (2002-12-17 13:49:00) [23]

ЗЫ а ссылочка www.fiblus.com.ua метрвая

Надо www.fibplus.com.ua


Alexandr   (2002-12-17 13:46:00) [24]

1) fibplus.com.ua
2) Конечно, изврат ты какой-то придумал...


Calm   (2002-12-17 13:41:00) [25]

Делаю MyDS.Transaction.Commint, после чего добавленная запись видна, но вот выборка, сделанная процедурой, не отображается в гриде.
ПОлучается нельзя в одной хранимой процедуре одновременно осуществить добавление и выборку?

ЗЫ а ссылочка www.fiblus.com.ua метрвая


Prooksius   (2002-12-17 13:26:00) [26]

Лучше явно работать с транзакциями. Стартуешь, комитишь при отсутствии ошибок, откатываешь при ошибках. Все видно.
Похоже, при закрытии программы у тебя происходит роллбэк.
Не знаю, как ведет себя FIBPlus при неявной работе с транз. - так с ними не работаю.
У pFIBDataBase есть эвент BeforeEndTransaction. Поиграйся с параметрами.

P.S. Генератор работает вне транзакций и от них не зависит.


Calm   (2002-12-17 13:26:00) [27]

2 Alexandr и Prooksius: Спасибо!Заработало :))


Alexandr   (2002-12-17 13:22:00) [28]

MyDS.Close;
MyDS.Transaction.Commit;


Короче, читай доку, читай www.fiblus.com.ua
и все станет ясно


Calm   (2002-12-17 13:18:00) [29]


> Alexandr © (17.12.02 13:17)
> и все-таки commit.

Не сочти за труд - поясни немного


Calm   (2002-12-17 13:17:00) [30]


> Prooksius © (17.12.02 13:15)
> Alexandr © (17.12.02 13:07) возможно прав.
> Как ты завершаешь работу с транзакцией, в которой ты это
> делаешь?

Я думал, что не нужно явно стартовать и завершать транзакции при подобных запросах.
Никаких дополнительных действий я не делаю. Только то, что написал в вопросе. Нужно еще что-то?


Alexandr   (2002-12-17 13:17:00) [31]

и все-таки commit.


Calm   (2002-12-17 13:15:00) [32]

Вот процедурка

CREATE PROCEDURE ADD_TASK_CASCAD (
AHHOID integer,
ACIID integer,
AVFLOAT DOUBLE PRECISION,
AROOTID INTEGER,
AIDATE DATE,
ADATEPOINTID integer)
RETURNS (
OUT_TASKID INTEGER,
OUT_SUPPORTCIID INTEGER)
AS
begin

insert into Task (HHO, CtrlItem, CtrlItemKindCode, VFloat, IDate, ActiveStatus, Root, DatePoint)
values (:ahhoid, :aciid, 0, :vfloat, :aidate, 1, :arootid, :adatepointid);

/* Сначала нужно вернуть id только что добавленной записи в Task */
out_taskid=gen_id(gen__task, 0);
out_supportciid=:lciid;
suspend;


for select GSCI.out_CIID
from get_supportctrlitem_ext(:aciid) GSCI
into :out_supportciid
do begin
suspend;
end
end

Итак, в IBEXpert"t работает как нужно.
Из клиентского приложения - выборка возвращается правильная, а запись не добавляется. Хотя генератор изменяется.


Prooksius   (2002-12-17 13:15:00) [33]

Alexandr © (17.12.02 13:07) возможно прав.
Как ты завершаешь работу с транзакцией, в которой ты это делаешь?
Надо Commit. Иначе данные не инсертнутся.


Prooksius   (2002-12-17 13:10:00) [34]

Давай текст процедуры


Calm   (2002-12-17 13:09:00) [35]


> Alexandr © (17.12.02 13:07)
> commit

Это что? Куда?


Calm   (2002-12-17 13:08:00) [36]

Может, но...
Я уже пробовал и Delphi и IBExpert выгружать и заново запускать. Все равно не видно...

Последовательность действий такова:
1. Запускаю клиентское приложение, выполняю запрос.
2. Закрываю клиента. В design-time Delphi подключения к БД нет.
3. Открываю IBExpert
4. Не вижу записи, которая должна быть добавлена

Так, что вроде бы транзакции ни при чем...


Alexandr   (2002-12-17 13:07:00) [37]

commit


Prooksius   (2002-12-17 13:01:00) [38]

Может, ты ее просто не видишь (другая транзакция)?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо