Я хочу записать содержимое моей базы данных SQlite по щелчку пользователя в другую базу данных SQlite. Для этого я пытаюсь установить соединение с двумя базами данных и выбрать запрос из одной базы данных, а в транзакции вставить запрос в другую. Но я получаю ошибку при создании самого соединения.
В заголовочном файле:
private:
QSqlDatabase database;
QSqlDatabase mHistoryDB;
В исходном файле:
qDebug() << Q_FUNC_INFO << "Invoked";
database = QSqlDatabase::addDatabase("QSQLITE");
mHistoryDB = QSqlDatabase::addDatabase("QSQLITE");
#ifdef Q_OS_WIN
database.setDatabaseName("C:/ANDROID_DATABASE/RestPos.sqlite");
mHistoryDB.setDatabaseName("C:/ANDROID_DATABASE/History/RestPos.sqlite");
#else
database.setDatabaseName("/mnt/sdcard/pos/RestPos.sqlite");
mHistoryDB.setDatabaseName("/mnt/sdcard/pos/History/RestPos.sqlite");
#endif
Во время работы я получаю следующую ошибку:
QSqlDatabasePrivate :: removeDatabase: соединение ‘qt_sql_default_connection’ все еще используется, все запросы перестанут работать.
QSqlDatabasePrivate :: addDatabase: повторяющееся имя соединения ‘qt_sql_default_connection’, старое соединение удалено.
Если я использую только база данных Соединение не происходит без ошибок. Я не уверен, как сделать копию с одним подключением.
Мой текущий код копии, как показано ниже:
bool readStatus = false,
writeStatus = false;
if (database.isOpen() && mHistoryDB.open())
{
QSqlQuery readQuery (database);
QSqlQuery writeQuery(mHistoryDB);
readStatus
= readQuery.exec("SELECT costcentre_id, bill_no, bill_date ""FROM BillHdr");
qDebug() << Q_FUNC_INFO << getLastExecutedQuery(readQuery);
if (readStatus)
{
mHistoryDB.transaction();
writeQuery.prepare("INSERT INTO BillHdr ""(costcentre_id, bill_no, bill_date) ""VALUES (:costcentre_id, :bill_no, :bill_date)");
while(readQuery.next())
{
if (readQuery.isValid())
{
BillHeader billHdr;
billHdr.costCenterId = readQuery.value(0).toString();
billHdr.billNumber = readQuery.value(1).toDouble();
billHdr.date = readQuery.value(2).toDate();
writeQuery.bindValue(":costcentre_id", billHdr.costCenterId);
writeQuery.bindValue(":bill_no", billHdr.billNumber);
writeQuery.bindValue(":bill_date", billHdr.date);
writeStatus = writeQuery.exec();
qDebug() << Q_FUNC_INFO << getLastExecutedQuery(writeQuery);
if (!writeStatus)
{
qDebug() << Q_FUNC_INFO << "error in write" <<
writeQuery.lastError().text();
mHistoryDB.rollback();
mHistoryDB.close();
break;
}
}
}
writeStatus = mHistoryDB.commit();
qDebug() << Q_FUNC_INFO << "commit:" << writeStatus;
if (!writeStatus)
{
mHistoryDB.rollback();
}
mHistoryDB.close();
}
}
qDebug() << Q_FUNC_INFO << "Exits" << writeStatus;
return writeStatus;
Мы можем прочитать из документации Qt о QSqlDatabase
:
Предупреждение. Если вы добавляете соединение с тем же именем, что и существующее соединение, новое соединение заменяет старое. Если вы называете это
функционировать более одного раза без указания имени соединения, по умолчанию
будет заменено соединение.
Поэтому, когда вы добавляете базу данных несколько раз под определенным именем или без указания какого-либо (соединение по умолчанию), соединение заменяется, и появляется это предупреждение.
ты должен позвонить QSqlDatabase::addDatabase()
один раз для каждой из баз данных с разными именами соединений:
database = QSqlDatabase::addDatabase("QSQLITE", "database_Connection");
mHistoryDB = QSqlDatabase::addDatabase("QSQLITE", "mHistoryDB_Connection");