天天看點

QT 調用Access資料庫 (QT ODBC Driver)

最近有兄弟讓我幫他寫個簡單的程式,需要調用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