Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2013, 12:40   #1
water_
Пользователь
 
Регистрация: 01.11.2013
Сообщений: 34
По умолчанию запись данных одной транзакцией

Здравствуйте,
сразу к сути вопроса
firebird, FIBPlus
выполняется парсинг файла.
определенные данные записываются в несколько таблиц базы данных,
записываются через хп (qoStartTransaction = true, qoAutoCommit = true),
как правило за один раз хп делает одну запись. всего записей 2000-3000.
данный вариант работает замечательно, но решил выполнить запись данных одной транзакцией,
поскольку "не надо делать commit после каждой записи"
параметры хп qoStartTransaction и qoAutoCommit поменял на false
Код:
	
  tr1: TpFIBTransaction;
	...
  tr1.StartTransaction;
  try    
    pParcingFile(filename);
    tr1.Commit;
  except
    tr1.Rollback;    
  end;
после парсинга значения генераторов соответствуют количеству записанных записей,
но в таблицах этих записей нет, пока не закрою саму программу.
что я не учел?
water_ вне форума Ответить с цитированием
Старый 27.11.2013, 12:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

tr1 точно участвует в записи? Я не спец по FIBPlus конечно, но мало ли...
Имеется ввиду что сам tr1.Commit; не выполняется или не влияет вовсе на запись.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2013, 13:07   #3
water_
Пользователь
 
Регистрация: 01.11.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
tr1 точно участвует в записи?
да
приведенный код выше аналогичен...
Код:
  tr1: TpFIBTransaction;
  sProcTemp: TpFIBStoredProc;
	...
  sProcTemp.Transaction:= tr1;	
  sProcTemp.Transaction.StartTransaction;
  try    
    pParceFile(filename);
    sProcTemp.Transaction.Commit;
  except
    sProcTemp.Transaction.Rollback;
  end;
во время работы процедуры pParceFile, именно sProcTemp работает с хранимыми процедурами бд

Последний раз редактировалось water_; 27.11.2013 в 13:17.
water_ вне форума Ответить с цитированием
Старый 27.11.2013, 13:37   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Даже не знаю...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2013, 13:54   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

мало кода.
eval вне форума Ответить с цитированием
Старый 27.11.2013, 14:37   #6
water_
Пользователь
 
Регистрация: 01.11.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
мало кода.
повторю, данные в БД записываются, тому подтверждение значение генераторов и, собственно, самих данных, которые записываются в БД, но только после закрытия приложения.

пример одной записи в одну из таблиц, в приложении
Код:
   
      sName, sNameRoad, sCaption: string   
...
      sProcTemp.StoredProcName:='ACDLAYERS_INS';
      sProcTemp.ParamByName('NAME').AsString:= sName;
      sProcTemp.ParamByName('NAMEROAD').AsString:= sNameRoad;
      sProcTemp.ParamByName('CAPTION').AsString:= sCaption;
      sProcTemp.ExecProc;
хранимая процедура бд
Код:
CREATE PROCEDURE ACDLAYERS_Ins(name VARCHAR(10),
	nameRoad VARCHAR(10),
	caption VARCHAR(20))
AS
DECLARE rname VARCHAR(10);
DECLARE r INT;
BEGIN
	r = -1;
	SELECT id FROM ACD_Roads WHERE UPPER(name) = UPPER(:nameRoad) AND 
                     EXISTS(SELECT id FROM ACD_Roads WHERE UPPER(name) = UPPER(:nameRoad))
		INTO :r;
	IF(r=-1)THEN BEGIN
		INSERT INTO ACD_ROADS VALUES (0,:nameRoad, '', 'today', 'today');
		r = GEN_ID(gen_acdRoads,0);
	END
	FOR SELECT name FROM Acd_Layers WHERE (id_road = :r) INTO :rname DO
		IF (UPPER(:rname) = UPPER(:name)) THEN 
			r = -1;
	IF (r <> -1)THEN BEGIN			
		INSERT INTO Acd_Layers VALUES(0,:r,:name,:caption);
		UPDATE Acd_Roads SET date_mod = CURRENT_DATE WHERE UPPER(Acd_Roads.name) = UPPER(:nameRoad);
	END
END

Последний раз редактировалось water_; 27.11.2013 в 14:46.
water_ вне форума Ответить с цитированием
Старый 27.11.2013, 14:45   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Такое бывает, когда COMMIT выполняется при закрытии приложения, а до этого нет.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2013, 14:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да, но в коде у автора есть коммит транзакции.
Может коммитить нужно не только транзакцию?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2013, 08:23   #9
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

Код:
tr1: TpFIBTransaction;
	...
  tr1.StartTransaction;
  try    
    pParcingFile(filename);
    tr1.CommitRetaining;
  except
    tr1.RollbackRetaining;    
  end;
в свойствах tr1 ставим read_committed
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 29.11.2013, 13:10   #10
water_
Пользователь
 
Регистрация: 01.11.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
мало кода
действительно,
как выяснилось проблема даже не касалась fib

в процедуре использовался класс, методы которого и вызывали хп базы данных,
так вот,
Код:
LMethod:= TSomeClass.Create(nil);
не имел своего
Код:
LMethod.Free;
и поэтому жил до закрытия программы

всем спасибо, топик можно закрывать (надеюсь кому-нибудь он будет полезен)
water_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с транзакцией Alek-de-Mik Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 18.01.2013 14:16
Запись данных с одной таблицы в другую timedo PHP 9 10.11.2012 11:21
Проблема с транзакцией semak777 БД в Delphi 5 26.02.2012 12:15
Как при вводе данных на одной форме - добавить запись на двух связанных таблицах? маврик Microsoft Office Access 13 05.11.2009 10:40
Передача данных из одной таблицы в другую, при выборе одной ячейки MickMick Microsoft Office Excel 6 06.10.2008 13:57