QODBC 接口
QODBC Driver是QT自帶的組件,是QT對ODBC的封裝,理論上可以用來連接任何支持ODBC數(shù)據(jù)源的數(shù)據(jù)庫,比如Access、SQL Server、MySql、HGDB、Oracle等。為數(shù)據(jù)庫編程提供了一個類似JDBC的統(tǒng)一操作模型,它的底層是具體數(shù)據(jù)庫或數(shù)據(jù)庫接口的插件,由它們負(fù)責(zé)完成真正的數(shù)據(jù)庫操作。
Qt(官方發(fā)音 [kju:t],音同 cute) 是一個1991年由Qt Company開發(fā)的跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴(kuò)展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴(kuò)展,并且允許真正地組件編程。
Qt Creator是一個用于Qt開發(fā)的輕量級跨平臺集成開發(fā)環(huán)境。Qt Creator可帶來兩大關(guān)鍵益處:提供首個專為支持跨平臺開發(fā)而設(shè)計的集成開發(fā)環(huán)境 (IDE),并確保首次接觸Qt框架的開發(fā)人員能迅速上手和操作。即使不開發(fā)Qt應(yīng)用程序,Qt Creator也是一個簡單易用且功能強(qiáng)大的IDE。
本章節(jié)詳細(xì)介紹 QT QODBC 連接瀚高數(shù)據(jù)庫。
調(diào)用關(guān)系
QT應(yīng)用程序←→QODBC←→unixODBC←→HGDB ODBC
創(chuàng)建一個數(shù)據(jù)庫連接需要三個操作:
- 激活驅(qū)動程序
- 設(shè)置連接信息
- 打開連接
開發(fā)環(huán)境搭建
軟件 |
版本 |
HGDB |
安全版V4、企業(yè)版v5及以上版本 |
IDE |
Qt Creator 4.10.1 |
前提準(zhǔn)備
- ODBC數(shù)據(jù)源配置:配置方式參照 C\C++部分的ODBC,具體視windows環(huán)境、Linux環(huán)境操作
- QT開發(fā)工具 Qt Creator
示例代碼
main.cpp
#include "mainwindow.h" #include <QApplication> #include <QSqlDatabase> #include <QSqlError> #include <QDebug> #include <QSqlQuery> #pragma execution_character_set("utf-8")
int main(int argc, char *argv[]) { QApplication a(argc, argv); //MainWindow w; //w.show();
QString strHost = "192.168.2.5"; int port = 5866; QString strDbName = "test"; QString strUserName = "test"; QString strUserPwd = "test"; QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); QString strconn = QString("Driver={PostgreSQL Unicode(x64)};SERVER=%1;PORT=%2;DATABASE=%3;UID=%4;PWD=%5;") .arg(strHost) .arg(port) .arg(strDbName) .arg(strUserName) .arg(strUserPwd); db.setDatabaseName(strconn); if (!db.open()) { qDebug() <<"error_pgServer:" << db.lastError().text(); return 1201; } else { qDebug() << "連接成功!"; }
QSqlQuery query =QSqlQuery(db); QString str;
//新增數(shù)據(jù) query.prepare("insert into student (name,age) values (:name,:age)"); query.bindValue(":name","Qt2"); query.bindValue(":age",24); if(query.exec()) { qDebug() <<"add sucessful!"; } else { qDebug() <<"add failed!"; }
//查詢數(shù)據(jù) //可以復(fù)用上面的QSqlQuery對象,也可以重新new,復(fù)用的話需要先調(diào)用clear query.clear(); query.exec("select * from student"); while(query.next()) { str = QString("id=%1;name=%2;age=%3") .arg(query.value(0).toInt()) .arg(query.value(1).toString()) .arg(query.value(2).toString()); qDebug() << str; }
//更新數(shù)據(jù),如果不加where條件則表示更新整個表的數(shù)據(jù) query.clear(); query.prepare("update student set name=:new_name where name=:name"); query.bindValue(":new_name","Qt2222"); query.bindValue(":name","Qt2"); //添加+刪除+更新 數(shù)據(jù)只需要知道執(zhí)行成功與否就行 if(query.exec()) { qDebug() <<"update sucessful!"; } else { qDebug() <<"update failed!";
}
//關(guān)閉數(shù)據(jù)庫,程序自動關(guān)閉的時候也會關(guān)閉,所以只是用一個數(shù)據(jù)庫的情況下無需手動關(guān)閉 db.close();
return a.exec(); }
|
執(zhí)行結(jié)果:
圖1:執(zhí)行了add和update操作

圖2:顯示為update操作執(zhí)行后的結(jié)果
