在Qt中使用QProcess備份和恢復(fù)Mysql數(shù)據(jù)庫(kù)
使用Qt做MySQL數(shù)據(jù)庫(kù)開(kāi)發(fā),遇到需要備份、還原數(shù)據(jù)庫(kù)的問(wèn)題。MySQL中沒(méi)有提供將數(shù)據(jù)庫(kù)備份成.sql文件的SQL語(yǔ)句,而是提供了一個(gè)mysqldump.exe工具來(lái)完成這個(gè)功能。沒(méi)有SQL語(yǔ)句,QSqlQuery就用不成了,決定改用QProcess實(shí)現(xiàn)。
但是在Qt中使用QProcess::execute()方法怎樣都導(dǎo)不出數(shù)據(jù)來(lái),更郁悶的是在Qt提供的Qt Command Prompt命令行工具里都提示找不到mysqldump.exe程序,
剛開(kāi)始我懷疑,莫非Qt就是不支持非Windows/System32目錄指令之外的指令了?
.
上網(wǎng)搜索"qt 備份Mysql數(shù)據(jù)庫(kù)",結(jié)果就發(fā)現(xiàn)問(wèn)題的原因了。這篇"Qt中使用QProcess::execute()時(shí)需要注意的問(wèn)題",在Windows中的Qt程序使用QProcess::execute()方法,不能使用管道、重定向操作符,要有重定向操作符把內(nèi)容重定向到文件或者從文件中讀取輸入的話(huà),則需要設(shè)置QProcess對(duì)象的標(biāo)準(zhǔn)輸入、輸出文件為自己需要的文件。
一般來(lái)說(shuō)Windows中使用的命令行程序很少有用到管道和重定向的,因?yàn)閃indows的控制臺(tái)本身不支持管道和重定向操作。
但這個(gè)mysqldump就是個(gè)特例,它需要將輸出重定向到文件。
但是像
- QProcess::execute("mysqldump.exe -uUsrName -pUsrPsd DbName > d:/backup.sql")
的函數(shù)是執(zhí)行不了的,至少在windows里執(zhí)行不出來(lái)。
從Qt4.2開(kāi)始QProcess提供了setStandardInputFile (), setStandardOutputFile (), setStandardOutputProcess (). 三個(gè)函數(shù)來(lái)處理Windows中程序遇到管道和重定向問(wèn)題,用start()方法替代execute()方法,然后使用 setStandardOutputFile ()等方式重定向輸出或輸入。
具體就是,應(yīng)該將mysqldump操作寫(xiě)成下面這樣:
- QString Cmd = QString("mysqldump.exe --add-drop-table -u%1 -p%2 test").arg("UsrName","UsrPsd");
- QString Path = QString("%1").arg("d://backup.Sql");
- QProcess *poc=new QProcess;
- poc->setStandardOutputFile(Path);
- poc->start(Cmd);
- QString Cmd = QString("mysqldump.exe --add-drop-table -u%1 -p%2 test").arg("UsrName","UsrPsd");
- QString Path = QString("%1").arg("d://backup.Sql");
- QProcess *poc=new QProcess;
- poc->setStandardOutputFile(Path);
- poc->start(Cmd);
相應(yīng)的還原數(shù)據(jù)庫(kù)操作應(yīng)該寫(xiě)成這樣:
- QString Cmd = QString("mysql.exe -u%1 -p%2 test").arg("UsrName","UsrPsd");
- QString Path = QString("%1").arg("d://backup.Sql");
- QProcess *poc=new QProcess;
- poc->setStandardInputFile(Path);
- poc->start(Cmd);
小結(jié):在Qt中使用QProcess備份和恢復(fù)Mysql數(shù)據(jù)庫(kù)的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!