fzx374的个人主页

http://www.qtcn.org/bbs/u/110068  [收藏] [复制]

fzx374

  • 4

    关注

  • 9

    粉丝

  • 14

    访客

  • 等级:新手上路
  • 总积分:62
  • 保密,2010-12-21

最后登录:2015-06-01

更多资料

日志

qt+mysql下3种恢复sql数据方法比较

2012-12-25 22:33
环境:windows7+qt4.8.1+mysql5.5
目的:mysql数据服务器运行在U盘上(免安装),利用mysql.exe恢复(通过mysqldump)备份的*.sql数据文件,有早间会失败。于是想通过SQL语句恢复。有三种方法,即一是通过仍然调用mysql.exe恢复,二是通过QFile,一次性读取全部*.sql文件,再执行query.exe(),三是逐行读取,语句加工后再query.exe()。各运行10次,结果为
第一次,分别用手工记录10次,mysql.exe计175秒,逐行读取读取计170秒,读取all计178秒。
第二次,让程序自动循环10次,mysql.exe计197秒,逐行读取读取计196秒,读取all计198秒。
结果:逐行读取最优。
bool MainWindow::myRestore(QString DBName){    bool ok = true;    int total =0;    for (int n=0; n<10; n++) {        QTime time1 = QTime::currentTime();         //2012.12.24,用mysql命令恢复数据,用时30秒,自已每行每行读取,恢复数据费时46秒。        //从模板恢复        //bool ok = true;        QSqlQuery query;        query.exec("SET @bl=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;");        QString program = "mysql";        QStringList arguments;        if (QSqlDatabase::database().password()!="") arguments << "-p" + QSqlDatabase::database().password();        arguments << "-u" << QSqlDatabase::database().userName()                  << "-h" <<QSqlDatabase::database().hostName()                  << "--database" << QSqlDatabase::database().databaseName();        QProcess *mysql_Process = new QProcess;        mysql_Process->setStandardInputFile(DBName);        mysql_Process->start(program, arguments);        ok= mysql_Process->waitForFinished();        query.exec("SET FOREIGN_KEY_CHECKS=@bl;");/*        QSqlQuery query;        QSqlError error;        QSqlDatabase::database().transaction();     //事务        QString sql = "SET @bl=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;";        if (!query.exec(sql)) error = query.lastError();        QFile file(DBName);        if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {            QTextStream in(&file);            in.setCodec("UTF-8");            //sql = in.readAll();        //与下句为读取所有            //if (!query.exec(sql)) error = query.lastError();            QString line;            do {                line = in.readLine().simplified();                if (!line.isEmpty() && !line.startsWith("--") && !line.startsWith("/*") ) {                    if (sql.endsWith(";")) {                        if (!query.exec(sql))                            error = query.lastError();                        sql = line;                    }                    else {                        sql += line;                    }                }            } while (!line.isNull());            //通过事务,真正试写入            if (error.type() == QSqlError::NoError) {                sql = "SET FOREIGN_KEY_CHECKS=@bl;";                query.exec(sql);                QSqlDatabase::database().commit();            }            else {                QApplication::beep();                QSqlDatabase::database().rollback();                ok = false;            }        }        else {            ok = false;        }*/        QTime time2 = QTime::currentTime();        int s = (time2.minute() -time1.minute())*60 + time2.second() -time1.second();        total += s;    }    QMessageBox::warning(0,"uuu",QString::number(total));    return ok;}
分类:默认分类|回复:0|浏览:1034|全站可见|转载
 

Powered by phpwind v8.7 Certificate Copyright Time now is:04-29 18:02
©2005-2016 QTCN开发网 版权所有 Gzip disabled