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操作

image-20220516194854752

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

image-20220516195016937