在sqlite数据库之间复制表qt会导致错误

时间:2014-12-30 12:43:16

标签: c++ database qt sqlite qsqldatabase

我想在用户点击另一个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;

1 个答案:

答案 0 :(得分:2)

我们可以阅读有关QSqlDatabase

的Qt文档
  

警告:如果添加与现有连接同名的连接,则新连接将替换旧连接。如果你这样称呼   函数不止一次而没有指定connectionName,默认值   连接将被替换。

因此,当您在特定名称中多次添加数据库或未指定任何(默认连接)时,将替换连接并显示该警告。

您应该为具有不同连接名称的每个数据库调用QSqlDatabase::addDatabase()一次:

database = QSqlDatabase::addDatabase("QSQLITE", "database_Connection");
mHistoryDB = QSqlDatabase::addDatabase("QSQLITE", "mHistoryDB_Connection");