2014-10-07 88 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