如何使用Qt sqlite .dump

时间:2014-10-07 08:46:00

标签: qt sqlite

我想使用Qt之类的.dump表,

源码> sqlite3 a.db" .dump" | sqlite3 b.db

我使用dump来恢复损坏的表或数据库。 但我想用Qt转储。 所以我制作了这段代码

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 个答案:

答案 0 :(得分:1)

QSqlQuery subQuery( copyDb );之后添加:

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

mainDb.close();之前添加:

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