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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2013, 15:20   #1
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию Ошибка при добавлении нескольких запросов в транзакцию

Добрый день, проблема такая, есть таблица Оргранизации и есть таблица телефонов этих организаций.

На формачке едит и кнопочка которая позволяет добавлять к организации несоклько телефонов и чтобы не забивать таблицу телефонов данными которые возможно не будут добавлены есть транзакция.

Код:
  with DM.IBOrgTel do
    begin
      SQL.Text:='execute procedure PROC_INS_ORG_TEL (:id_otel, :id_org, :tel)';
      ParamByName('id_otel').AsInteger:=-1;
      ParamByName('id_org').AsInteger:=-1;
      ParamByName('tel').AsString:=Edit2.Text;
      Memo1.Lines.Add(Edit2.Text);
      Transaction.StartTransaction;
      ExecSQL;
    end;
После первого добавления, если пытаюсь добавить ешё что то то говорит что транзакция активна!

Коммит не делаю специально, чтобы дселат ьего вместе с добавлением других данынх по организации...

свойство транзакции РидКомимит
read_committed
rec_version
nowait

В чём проблема?
Dozent вне форума Ответить с цитированием
Старый 19.02.2013, 15:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

StartTransaction перед циклом добавления
В цикле добавить несколько записей
По концу цикла Commit
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.02.2013, 15:28   #3
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Ну т.к. у меня нет цикла, то как вариант при собитии onShow данной формы сойдёт? или это бред?
Dozent вне форума Ответить с цитированием
Старый 19.02.2013, 15:30   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так у вас и Commit нет. Скорее всего есть не закрытая транзакция и ошибка вываливается на StartTransaction. И что цикла явного нет не важно. Вы кнопку добавления несколько раз нажали - вот и цикл. Кстати если по кнопке, то лучше каждую запись добавлять в своей транзакции. Иначе одну добавил, пошел лясы точить, а транзакция висит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.02.2013 в 15:33.
Аватар вне форума Ответить с цитированием
Старый 19.02.2013, 15:42   #5
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Commit будит при нажатии кнопки сохранить данные об Организации, а на каждый клик транзакцию думаю ненадо создавать, ведь это будит лишним.
Dozent вне форума Ответить с цитированием
Старый 19.02.2013, 15:45   #6
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Да вообщем сделал так, на событие onShow сделал старт транзакции, на кнопке сохранить (всю инфу об организации сделал коммит этой транзакции) всё как я и хотел, спс.

P.S. Или что то не так?
Dozent вне форума Ответить с цитированием
Старый 19.02.2013, 15:47   #7
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

А ешё такой вопрос, передо коммитом я могу сделать ешё апдейт? мне нужно изменить одно из полей перед добавлением в таблицу?
Dozent вне форума Ответить с цитированием
Старый 19.02.2013, 15:48   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
а на каждый клик транзакцию думаю ненадо создавать, ведь это будит лишним
А на это что скажете при многопользовательской работе?
Цитата:
Иначе одну добавил, пошел лясы точить, а транзакция висит
Транзакцию открывать и закрывать надо на самое минимальное время, иначе в многопользовательском режиме полный абзац будет. Удобства вашего подхода поняты - откатить транзакцию по кнопке для группы записей. Так и пишите в базу только по кнопке подтверждения в рамках одной транзакции, или не пишите по отказу от сохранения. Внесенные номера можно и в массиве до записи в базу хранить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.02.2013, 15:57   #9
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Чем плохо что транзакция будит долгое время не закрыта?
Dozent вне форума Ответить с цитированием
Старый 19.02.2013, 16:18   #10
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Так, осознал, признаю, виноват, сейчас буду переделывать, чтобы жизнь транзакции была минимальной. такой вопрос достаточно сделать transaction.Commit чтобы транзакция завершилась, обязательно ли делат ьешё Transaction.Active:=false ?
Dozent вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при добавлении в базу 622089 PHP 3 29.02.2012 22:55
Ошибка при добавлении записи Itachi БД в Delphi 1 10.06.2011 13:30
Ошибка при добавлении данных в бд prizrak1390 PHP 3 29.07.2010 22:47
Ошибка при добавлении данных Ehha1234 БД в Delphi 0 19.06.2010 20:33
Ошибка при добавлении запроса KARUSHEV Помощь студентам 3 27.01.2010 08:45