2014-10-07 90 views
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〜。 如何减少运行时间或其他方式来恢复损坏的数据库。

对不起,我的英语技能。

谢谢。

回答

1

QSqlQuery subQuery(copyDb);地址:

mainQuery.exec("BEGIN;"); 
subQuery.exec("BEGIN;"); 

之前mainDb.close();地址:

mainQuery.exec("COMMIT;"); 
subQuery.exec("COMMIT;"); 
+0

只是为了兴趣,为什么commiting子查询之前主查询? – Zaiborg 2014-10-07 11:48:35

+0

没有特别的理由。 @ kisang在他的原始代码中首先关闭了'mainDb',所以我认为这很自然地首先提交它。 – Googie 2014-10-07 12:05:34