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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SQLite & transaction()  (Прочитано 16828 раз)
-QT-
Гость
« : Апрель 27, 2009, 13:39 »

Доброго времени суток !

Использую в программе:
Код
C++ (Qt)
db.transaction();
...
if(!q.exec())
  db.rollbak();
else
  db.commit();
 

В итоге получаю, что db.commit() равно FALSE и
соответственно не закрывается транзакция.
Что это может быть? Это баг в драйвере ?

QT 4.5.0 static
Записан
Rcus
Гость
« Ответ #1 : Апрель 27, 2009, 13:42 »

Цитировать
bool QSqlDatabase::commit ()

Commits a transaction to the database if the driver supports transactions and a transaction() has been started. Returns true if the operation succeeded. Otherwise it returns false.

Note: For some databases, the commit will fail and return false if there is an active query using the database for a SELECT. Make the query inactive before doing the commit.

Call lastError() to get information about errors.
Записан
-QT-
Гость
« Ответ #2 : Апрель 27, 2009, 14:08 »

Простите за назойливость.

А
Цитировать
Make the query inactive before doing the commit.
это нужно сделать так:
q.clear();
Если так то это не отрабатывает.
Записан
spirit
Гость
« Ответ #3 : Апрель 27, 2009, 14:14 »

а так?
Код
C++ (Qt)
...
q = QSqlQuery();
...
 
Записан
-QT-
Гость
« Ответ #4 : Апрель 27, 2009, 14:21 »

а так?
Код
C++ (Qt)
...
q = QSqlQuery();
...
 

так тоже не отрабатывает.
Записан
-QT-
Гость
« Ответ #5 : Апрель 27, 2009, 14:36 »

Заметил что и в другом месте косяк.
Код
C++ (Qt)
QSqlDatabase db_import = QSqlDatabase::database("DBF_IMPORT");
QSqlQuery query(db_import);
query.exec("...")
...
query.clear();
db_import.close();
QSqlDatabase::removeDatabase("DBF_IMPORT");

QSqlDatabasePrivate::removeDatabase: connection 'DBF_IMPORT' is still in use, all queries will cease to work.

но я же все закрыл и очистил.
Записан
-QT-
Гость
« Ответ #6 : Апрель 27, 2009, 15:01 »

Решение для первой части вопроса:
http://www.qtcentre.org/forum/f-qt-programming-2/t-unable-to-commit-transaction-20290.html/?highlight=transaction
Ну и муторно же наф... так делать то ёёёёё.
У мну 4 представления и каждый раз нуно все чистить .... Шокированный
А так Всем спасибо за помощь.
Записан
-QT-
Гость
« Ответ #7 : Апрель 27, 2009, 16:42 »

Заметил что и в другом месте косяк.
Код
C++ (Qt)
QSqlDatabase db_import = QSqlDatabase::database("DBF_IMPORT");
QSqlQuery query(db_import);
query.exec("...")
...
query.clear();
db_import.close();
QSqlDatabase::removeDatabase("DBF_IMPORT");

QSqlDatabasePrivate::removeDatabase: connection 'DBF_IMPORT' is still in use, all queries will cease to work.

но я же все закрыл и очистил.

А вот это видимо баг. Так как removeDatabase работать без вышеуказанного варнинга небудет.
http://lists.trolltech.com/qt-interest/2006-02/thread01434-0.html
Записан
Krow
Гость
« Ответ #8 : Октябрь 17, 2009, 11:42 »

Код:
DB_Tovar = QSqlDatabase::database("tovar");
if (!DB_Tovar.open())
{
QMessageBox::critical(0, qApp->tr("Ошибка"),
             qApp->tr("Не удалось открыть базу данных"), QMessageBox::Cancel);
}
model = new QSqlTableModel(this, DB_Tovar);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("tovar");
...
if (!DB_Tovar.open())
{
QMessageBox::critical(0, qApp->tr("Ошибка"),
             qApp->tr("Не удалось открыть базу данных"), QMessageBox::Cancel);
}
if (!model->database().transaction())
QMessageBox::warning(0, "", "Not work transaction");
if (!model->query().exec(tr("UPDATE tovar SET kolvo='0'%1").arg(search)))
QMessageBox::warning(0, "", "Not work query");
if (!model->database().commit())
{
QMessageBox::warning(0, "", "Not work submit");
QMessageBox::warning(0, "", model->database().lastError().text());
}
DB_Tovar.close();
ошибка коммита: database is locked Unable to commit transaction.
не могу понять где косяк...
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #9 : Октябрь 17, 2009, 21:46 »

Цитировать
А вот это видимо баг. Так как removeDatabase работать без вышеуказанного варнинга небудет.
это вы видимо не читаете документацию - QSqlDatabase value class и надо ограничить область видимости его - сто раз было на форуме и есть в ассистенте - например

http://www.prog.org.ru/index.php?topic=10014.msg61002#msg61002


по поводу коммита в SQLite - а вообще то SQLite поддерживает работу с транзакциями - я не работал с этой БД - и поддерживает ли работу с транзакциями драйвер QT для SQLite - а то может вы зря мучаетесь?
« Последнее редактирование: Октябрь 17, 2009, 21:49 от break » Записан
Krow
Гость
« Ответ #10 : Октябрь 18, 2009, 06:23 »

насколько помню то поддерживает...
вот я представил кусок кода.. query отрабатывает нормально.. только вот после перезапуска программы изменение внесенные query возвращаются так как было до запроса...
Записан
Kagami
Гость
« Ответ #11 : Октябрь 18, 2009, 08:44 »

Попробуй лучше это:
Цитировать
void QSqlQuery::finish ()
Записан
Krow
Гость
« Ответ #12 : Октябрь 18, 2009, 15:58 »

пасибо. попытаюсь сегодня-завтра.. и отпишусь!
Записан
Krow
Гость
« Ответ #13 : Октябрь 19, 2009, 10:59 »

не помогает.... в пределах модели работает.. и ничего больше.. ( т.е не сохраняет изменения в базу..
Записан
Kagami
Гость
« Ответ #14 : Октябрь 19, 2009, 13:25 »

Может у тебя где-нибудь еще есть активные запросы к базе данных? Нигде не создавал на куче QSqlQuery?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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