最近有兄弟讓我幫他寫個簡單的程式,需要調用MS Office 中的Access資料庫檔案進行操作,希望我用VC寫。因為習慣了QT的簡單明了,同樣的windows平台程式,就選擇用QT幫他寫了。
以前項目中使用過Sqlite進行資料庫操作,基本的流程大緻清楚,但是這次需要調用Access,自然需要用到其他的資料庫Driver,也就是QT通過ODBC來連接配接SQLServer。
首先需要确認自己安裝QT是否帶有所需要的DB Driver。
通常安裝QT會預設安裝Sqlite的Driver,我們可以用以下代碼進行測試
QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("test.db");
if ( !m_db.open())
{
qDebug()<<"DB open error!";
}
else
{
qDebug()<<"DB open Sucess!";
}
而測試ODBC連接配接則不能簡單的仿照,setDatabaseName不是簡單的輸入資料庫名,而是DNS名。可以采用DSN連接配接字元串直接連接配接ODBC資料庫,也可直接設定DNS(沒有用過)。
簡單來說, 資料庫名應該這樣寫 "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
QSqlDatabase m_db = QSqlDatabase::addDatabase("QODBC");
m_db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=db.mdb;UID=;PWD=");
bool ok = m_db.open();
if(ok)
{
QDebug()<<"資料庫打開成功";
}
else
{
QDebug()<<資料庫打開失敗";
}
有一種更簡單的測試方法如下
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << "/t" << driver;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() << "ODBC driver valid?" << db.isValid();
}
如果輸出中有
Available drivers:
"QSQLITE"
"QODBC4"
"QODBC"
ODBC driver valid? true
就說明已經可以成功支援ODBC了。
如果你在安裝QT時什麼也沒有配置,通常隻會有QSQLITE出現。這樣就需要安裝QODBC4。
編譯ODBC插件。可以通過 configure -plugin-sql-odbc來保證,也可以單獨編譯~/src/plugins/sqldrivers/odbc
qmake -t vclib odbc.pro
qmake
nmake
編譯後,在~/plugins/sqldrivers/下應該有qsqlodbcd4.dll(debug)或qsqlodbc4.dll
這個方法是以前沒有注意到的,也就是在編譯QT源碼時如果有些插件或功能沒有編譯進去,可以單獨通過上述方法編譯,非常靈敏,以前都沒有注意到。
通過上述步驟就擁有了ODBC的QT driver了
于是就可以寫程式了。
在QSqlDatabase設定完後,再通過
QSqlQuery *m_pQuery = new QSqlQuery(m_db);
m_pQuery->exec("select * FROM Table1“) 這些正常sql語句就可以進行操作了
程式寫完後,需要将相應的庫檔案放在一起。除了正常的QtCore4.dll QtGui4.dll QtSql4.dll , 因為在windows下開發的Qt,還要把mingwm10.dll 加上。 最開始我直接将qsqlodbc4.dll 放在程式同級目錄下,發現無法打開資料庫檔案了。最後發現需要建一個sqldrivers檔案夾放在同級目錄,然後把qsqlodbc4.dll放進去就可以了。
其他相關可知識參考
http://v.tampacrave.com/html/sejishikongxiangguanwenzhang/20090429/122.html
http://www.cnblogs.com/buffer/archive/2009/05/25/1488613.html