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