0
我想用.tump表使用Qt like,如何使用Qt SQLite .dump
sqlite> sqlite3 a.db「.dump」| sqlite3 b.db
我正在使用轉儲恢復損壞的表或數據庫。 但我想用Qt使用dump。 所以我有這樣的代碼
mainDb = QSqlDatabase::addDatabase("QSQLITE" , "first");
mainDb.setDatabaseName("main.db");
mainDb.open();
copyDb = QSqlDatabase::addDatabase("QSQLITE" , "second");
copyDb.setDatabaseName("copy.db");
copyDb.open();
QSqlQuery mainQuery(mainDb);
QSqlQuery subQuery(copyDb);
bool ret = subQuery.exec("create table contents_list("
"id varchar(128) primary key not null,"
"data varchar(2048));");
if(!ret)
{
qDebug() << subQuery.lastError().text();
}
static const QString QUERYFORMAT("INSERT INTO CONTENTS_LIST(id, data) VALUES('%1' , '%2')");
mainQuery.exec("select * from contents_list");
QSqlRecord rec = mainQuery.record();
QString id, data;
QString queryString;
while(mainQuery.next())
{
id = mainQuery.value(rec.indexOf("id")).toString();
data = mainQuery.value(rec.indexOf("data")).toString();
qDebug() << id << " " << data ;
queryString = QUERYFORMAT.arg(id, data);
ret = subQuery.exec(queryString);
if(!ret)
{
qDebug() << subQuery.lastError().text();
}
}
mainQuery.exec("delete from contents_list");
subQuery.exec("select * from contents_list");
rec = subQuery.record();
while(subQuery.next())
{
id = subQuery.value(rec.indexOf("id")).toString();
data = subQuery.value(rec.indexOf("data")).toString();
qDebug() << id << " " << data ;
queryString = QUERYFORMAT.arg(id, data);
ret = mainQuery.exec(queryString);
if(!ret)
{
qDebug() << mainQuery.lastError().text();
}
}
subQuery.exec("drop table contents_list");
mainDb.close();
copyDb.close();
此代碼的工作正常,但運行時間是非常非常長時的記錄數超過10000〜。 如何減少運行時間或其他方式來恢復損壞的數據庫。
對不起,我的英語技能。
謝謝。
只是爲了興趣,爲什麼commiting子查詢之前主查詢? – Zaiborg 2014-10-07 11:48:35
沒有特別的理由。 @ kisang在他的原始代碼中首先關閉了'mainDb',所以我認爲這很自然地首先提交它。 – Googie 2014-10-07 12:05:34