Как копировать между двумя sqlite-memory-database? - PullRequest
2 голосов
/ 19 февраля 2012

Как копировать между двумя sqlite-memory-database в Qt.просто так:

QSqlDatabase db1 = QSqlDatabase::addDatabase ("QSQLITE", "db1");
QSqlDatabase db2 = QSqlDatabase::addDatabase ("QSQLITE", "db2");
db1.setDatabaseName (":memory:");
db2.setDatabaseName (":memory:");
db1.open();
db2.open();
//add Data to db1
//do sth to copy db1's data to db2 [How]

1 Ответ

4 голосов
/ 19 февраля 2012

Некоторое время назад у меня была похожая проблема (но я скопировал базу данных MySQL в SQLite).Я использовал следующий код (не проверял, полный код, ll. 40-167 )

QString table("mytable");
QSqlDatabase srcDB=QSqlDatabase::addDatabase("QSQLITE", "db1");
QSqlDatabase destDB=QSqlDatabase::addDatabase("QSQLITE", "db2");

QSqlQuery srcQuery(srcDB);
QSqlQuery destQuery(destDB);

// get table schema
if (!srcQuery.exec(QString("SHOW CREATE TABLE %1").arg(table)))
    return false;

QString tableCreateStr;

while(srcQuery.next())
  tableCreateStr=srcQuery.value(1).toString();

// drop destTable if exists
if (!destQuery.exec(QString("DROP TABLE IF EXISTS %1").arg(table)))
     return false;

// create new one
if (!destQuery.exec(tableCreateStr))
    return false;

// copy all entries
if (!srcQuery.exec(QString("SELECT * FROM %1").arg(table)))
    return false;

while (srcQuery.next()) {
    QSqlRecord record=srcQuery.record();
    QStringList names;
    QStringList placeholders;
    QList<QVariant > values;

    for (int i = 0; i < record.count(); ++i) {
        names << record.fieldName(i);
        placeholders << ":" + record.fieldName(i);

        QVariant value=srcQuery.value(i);

        if (value.type() == QVariant::String)
            values << "\"" + value.toString() + "\"";
        else
            values << value;
    }

    // build new query
    QString queryStr;
    queryStr.append("INSERT INTO " + table);
    queryStr.append(" (" + names.join(", ") + ") ");
    queryStr.append(" VALUES (" + placeholders.join(", ") + ");");

    destQuery.prepare(queryStr);

    foreach(QVariant value, values)
        destQuery.addBindValue(value);

    if (!destQuery.exec())
        return false;
}
...