Russian Qt Forum
Апрель 20, 2024, 00:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: не работают транзакции в MS Access  (Прочитано 4920 раз)
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« : Сентябрь 08, 2016, 08:46 »

при входе в программу производится подключение к базе access
Код:
QSqlDatabase my_db = QSqlDatabase::addDatabase("QODBC3","my_conn");
    QString str_conn="DRIVER={Microsoft Access Driver (*.mdb)};FIL={MSAccess};DSN='MSAccess';DBQ=C:/db/my_base.mdb";
    my_db.setDatabaseName(str_conn);
    if(!my_db.open())
//сообщим
    {
Открываем нужную нам форму, там меняем данные. Изменения заумные, с кучей условий, хотелось бы в случае чего не напортачить. Делаю примерно так:
Код:
SqlQuery qry(QSqlDatabase::database("my_conn"));
bool is_good=true;
QSqlDatabase::database("lit_conn").transaction();

is_good=qry.exec("DELETE ...");
if(is_good && .....)
  is_good=qry.exec("INSERT INTO ....");
if()if()if()

if(is_good)
{
  QSqlDatabase::database("my_conn").commit();
else
  QSqlDatabase::database("my_conn").rollback();
Так вот ничего не срабатывает, хотя отладчик показывает, что rollback() выполнен. Что я не так делаю? Или у Access транзакции такие же хитромудро вывернутые, как и весь синтаксис?
Access 2003. Qt 4.6
« Последнее редактирование: Сентябрь 08, 2016, 08:48 от mokynis » Записан

QT4, Qt5, Qt6 Debian, ArchLinux
Aleksey_A
Гость
« Ответ #1 : Сентябрь 08, 2016, 15:16 »

А у Access есть поддержка транзакций? Из оф.документации Qt:
Цитировать
bool QSqlDatabase::rollback()
Rolls back a transaction on the database, if the driver supports transactions and a transaction() has been started.

И у вас написано: QSqlDatabase::database("lit_conn").transaction();
А коммит/роллбек: QSqlDatabase::database("my_conn").rollback();
Старт транзакции и коммит/откат идут на разные соединения.

« Последнее редактирование: Сентябрь 08, 2016, 15:18 от Aleksey_A » Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #2 : Сентябрь 08, 2016, 16:06 »

насчет соединения-это я недоизменил реальный код. Я ж написал, что
Цитировать
Делаю примерно так:
насчет транзакция сам сомневаюсь, но MS help пишет:
Цитировать
Инструкция TRANSACTION Справка
Помощь > Access 2003 > Создание баз данных и объектов и работа с ними > Объекты баз данных > Работа с запросами > Справка по языку Microsoft Jet SQL > Язык управления данными
Используется, чтобы начинать и завершать явные операции.
Синтаксис
Начало новой операции
BEGIN TRANSACTION
Завершение операции с возвращением результата, полученного во время операции.
COMMIT [TRANSACTION | WORK]
Завершение операции с возвращением результата, полученного во время операции.
ROLLBACK [TRANSACTION | WORK]
правда, MS и соврать может (сколько раз уже сталкивался...). Я бы с этим Access'ом с удовольствием дел не имел, но приходится. Честно говоря, ни разу никакая транзакция там не удавалась (хоть через ODBC, хоть напрямую из самого Accesss'а), но в инете пишут, что вроде, работает...
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
Aleksey_A
Гость
« Ответ #3 : Сентябрь 08, 2016, 21:26 »

Тогда может быть попробовать не через
Код:
QSqlDatabase::database("ххх").transaction();
...
QSqlDatabase::database("ххх").commit();
а использовать операторы прямо в запросах:
Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3","my_conn");
...
db.exec("BEGIN TRANSACTION");
....
if(is_good) {
db.exec("COMMIT");
} else {
db.exec("ROLLBACK");
}
Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #4 : Сентябрь 09, 2016, 12:39 »

ответили мне на forum.sources.ru. Ответ очень похож на мой собственный опыт работы с Access
Цитировать
Транзакции в MS Access - это не транзакции в том смысле, в каком их интерпретируют "нормальные" SQL-серверы, а просто эмуляция - снапшот + UNDO-буфер. Работают ТОЛЬКО из среды MS Access и ТОЛЬКО с таблицами в текущей БД - т.е. ни со связанными таблицами, ни с обновляемыми запросами не работают (хотя и обрабатываются синтаксически - ошибок не возникает).
может, кому поможет. Хотя другого такого психа, как я, наверное, не будет  Смеющийся
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.