Наткнулся на проблему - не получается использовать транзакцию более одного
раза при работе с Firebird 2.1 через QIBASE.
Мне нужно было осуществлять вставку данных, в разные таблицы, в одной транзакции. Напоровшись на проблему вынужден был написать тестовую программу, которая делает простую вставку в явной транзакции.
Вот код:
C++ (Qt)
#include <QCoreApplication>
#include <QSqlTableModel>
#include <QSettings>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
bool connectToDatabse(QSettings &s)
{
QSqlDatabase database;
QString key;
s.beginGroup("Database");
key = "Driver";
if (s.contains(key)){
database = QSqlDatabase::addDatabase(s.value(key).toString());
}else{
qDebug() << "Key" << key << "is absent";
return false;
}
key = "DbName";
if (s.contains(key)){
database.setDatabaseName(s.value(key).toString());
}else{
qDebug() << "Key" << key << "is absent";
return false;
}
key = "UserName";
if (s.contains(key)){
database.setUserName(s.value(key).toString());
}else{
qDebug() << "Key" << key << "is absent";
return false;
}
key = "UserPassword";
if (s.contains(key)){
database.setPassword(s.value(key).toString());
}else{
qDebug() << "Key" << key << "is absent";
return false;
}
s.endGroup();
if (!database.open())
{
QString qerr = database.lastError().text();
qDebug() << "Error on open DB, reson:"
<< qerr;
return false;
}
qDebug() << database;
return true;
}
//---------------------------------------------------------------------
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
// Читаем настройки БД из INI-файла
QSettings s("settings.ini", QSettings::IniFormat);
if (!connectToDatabse(s))
return 1;
// Информация о таблице
QString table("entities");
table = table.toUpper();
const int columnForInsert = 2;
QSqlTableModel *model = new QSqlTableModel();
model->setTable(table);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
const int rowForInsert = 10;
int cnt = 0;
while (cnt < rowForInsert){
QString value = QString("testInsert-%1").arg(cnt);
qDebug() << value;
cnt++;
//-- вставляем пустую строку в модель
int row = model->rowCount();
if (!model->insertRow(row)){
qDebug() << "\t" << "Insert to model - ERROR, reson:" << model->lastError();
return 1;
}
//-- вставляем данные в модель
QModelIndex insertIndex = model->index(row, columnForInsert);
model->setData(insertIndex, value);
//-- фиксируем данные в БД
if (model->database().transaction()){
qDebug() << "\t" << "transaction - START";
}else{
qDebug() << "\t" << "transaction -" << model->database().lastError();
}
//
if (model->submitAll()){
qDebug() << "\t" << "submit - Ok";
}else{
qDebug() << "\t" << "submit - " << model->lastError();
}
//
if (model->database().commit()){
qDebug() << "\t" << "transaction - COMMIT";
}else{
qDebug() << "\t" << "transaction -" << model->lastError();
}
}
return 0;
}
Этот код должен сделать 10 вставок в БД. Однако, делает только одну вставку, а дальше ошибки.
Возможно я не правильно что-то делаю. Именно это я и хочу сейчас выяснить есть ли в моём коде ошибка или нет.
Дополнительные подробности, результаты работы через другие драйверы, можно посмотреть
тут