2

ユーザーがクリックすると、SQlite データベースの内容を別の SQlite データベースに書き込みたいと考えています。このために、私は2つのデータベースに接続し、1つのデータベースからクエリを選択し、トランザクションで別のデータベースにクエリを挿入しようとしています。しかし、接続の作成自体でエラーが発生します。

ヘッダー ファイル内:

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;
4

1 に答える 1

2

以下に関するQtのドキュメントから読むことができますQSqlDatabase

警告: 既存の接続と同じ名前の接続を追加すると、古い接続が新しい接続に置き換えられます。connectionName を指定せずにこの関数を複数回呼び出すと、デフォルトの接続が置き換えられます。

そのため、特定の名前でデータベースを複数回追加するか、何も指定せずに (既定の接続)、接続が置き換えられ、その警告が表示されます。

QSqlDatabase::addDatabase()異なる接続名を持つデータベースごとに 1 回呼び出す必要があります。

database = QSqlDatabase::addDatabase("QSQLITE", "database_Connection");
mHistoryDB = QSqlDatabase::addDatabase("QSQLITE", "mHistoryDB_Connection");
于 2014-12-30T14:16:21.550 に答える