Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
dev:qt:qt_ibase_fix_commit [2015/05/20 13:54] denis |
dev:qt:qt_ibase_fix_commit [2015/05/20 14:41] (текущий) denis [the solution] |
||
---|---|---|---|
Строка 18: | Строка 18: | ||
- qt code:<code cpp> | - qt code:<code cpp> | ||
QSqlDatabase db = ... | QSqlDatabase db = ... | ||
+ | QString sql = "drop sequence myseq"; | ||
| | ||
+ | db.transaction(); | ||
+ | QSqlQuery q(sql, db); | ||
+ | qDebug() << q.lastError().text(); // no error! | ||
+ | q.close(); | ||
+ | db.commit(); | ||
+ | qDebug() << q.lastError().text(); // error: unsuccessful metadata update... | ||
+ | | ||
+ | // trying to drop once more time | ||
+ | db.transaction(); | ||
+ | QSqlQuery q(sql, db); // blocked forever... | ||
+ | </code> | ||
+ | |||
+ | ==== the solution ==== | ||
+ | Edit file ''.../qtbase/src/sql/drivers/ibase/qsql_ibase.cpp'': | ||
+ | <code cpp> | ||
+ | bool QIBaseDriver::commitTransaction() | ||
+ | { | ||
+ | Q_D(QIBaseDriver); | ||
+ | if (!isOpen() || isOpenError()) | ||
+ | return false; | ||
+ | if (!d->trans) | ||
+ | return false; | ||
+ | |||
+ | isc_commit_transaction(d->status, &d->trans); | ||
+ | // d->trans = 0; | ||
+ | // return !d->isError(QT_TRANSLATE_NOOP("QIBaseDriver", "Unable to commit transaction"), | ||
+ | // QSqlError::TransactionError); | ||
+ | |||
+ | bool res = !d->isError(QT_TRANSLATE_NOOP("QIBaseDriver", "Unable to commit transaction"), | ||
+ | QSqlError::TransactionError); | ||
+ | if( !res ) | ||
+ | isc_rollback_transaction(d->status, &d->trans); | ||
+ | |||
+ | d->trans = 0; | ||
+ | |||
+ | return res; | ||
+ | } | ||
</code> | </code> | ||
+ | |||
+ | ==== ps ==== | ||
+ | Prefer explicit transation **start** and **commit** as shown above because it is not possible to avoid this problem executing queries with implicit transaction control. | ||
+ |