Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
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. | ||
| + | |||