Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.04.2014, 17:55
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию Ошибка "Невозможен запуск транзакций"

Всем привет)

Столкнулся с такой ерундовиной, что, если в блоке
Код:
try
  ADOConnection.BeginTrans;
    // вставка в БД
  ADOConnection.CommitTrans;
except
  ADOConnection.RollbackTrans;
end;
происходит ошибка, то при последующих действиях, где используется ADOQuery.ExecSQL (например, вставка, апдейт), получаю ошибку "В данном сеансе невозможен запуск дополнительных транзакций", которая сохраняется пока не перезайдешь

Как избежать? Отключаться не вариант...
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #2  
Старый 02.04.2014, 18:56
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А что за база? Может лучше явно вызывать ExecSQL('BEGIN TRANSACTION')?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 03.04.2014, 14:04
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

MySQL
Да, забыл сказать, что между beginTrans и CommitTrans не только вставка, но и много всего всякого - апдейт, селект и т.д. Что, впрочем, логично
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #4  
Старый 03.04.2014, 14:30
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

А не может быть так, что означенные манипуляции с транзакцией всунуты в какой-нибудь обработчик события DataSet-а, и в процессе его выполнения происходит неявный рекурсивный вход в него?
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
Mrak (04.04.2014)
  #5  
Старый 03.04.2014, 14:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Я делаю явный запуск транзакции через выполнение запроса begin transaction, чтоб уж наверняка. На адо как-то не особо полагаюсь (из всего адо использую только квери и команд).
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Mrak (04.04.2014)
  #6  
Старый 04.04.2014, 17:37
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Вобщем, извините, но разбираться нет времени(((
Скажите, так правильно оформлять:
Код:
try
  dm.PROTO_Connection.BeginTrans;

    if query_open(false, ADOQuery_Slut, 'INSERT INTO klients.klients ' +
    '(поля) VALUES (значения)', 'Ошибка подключения к БД!') = false then
      exit;

    if query_open(true, ADOQuery_Slut, 'SELECT LAST_INSERT_ID() FROM klients.klients',
    'Ошибка подключения к БД!') = false then exit;
    IdKlient:=ADOQuery_Slut.FieldByName('last_insert_id()').AsString;

    if query_open(false, ADOQuery_Slut, 'INSERT INTO proto.sc_zn ' +
    '(поля) VALUES (значения)', 'Ошибка подключения к БД!') = false then exit;

  dm.PROTO_Connection.CommitTrans;
  except
    dm.PROTO_Connection.RollbackTrans;
    exit;
  end;

...

function query_open(for_select: Boolean; querik: tadoquery; zapros, err_msg: string): boolean; // возвращает True, если запрос выполнился
begin
  Result:= true;
  querik.Close;
  Querik.SQL.text:=zapros;
  try
    if for_select = true then Querik.open
    else querik.ExecSQL;
  except
    on E : Exception do
    begin
      screen.Cursor:=crDefault; 
      messageDlg(err_msg + #13 + #13 + '[' + E.Message + ']', mtError, [mbOK], 0);
      querik.Close;
      Result:= false;
    end;
  end;
end;
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025