QODBC 接口

QODBC Driver是QT自带的组件,是QT对ODBC的封装,理论上可以用来连接任何支持ODBC数据源的数据库,比如Access、SQL Server、MySql、HGDB、Oracle等。为数据库编程提供了一个类似JDBC的统一操作模型,它的底层是具体数据库或数据库接口的插件,由它们负责完成真正的数据库操作。

Qt(官方发音 [kju:t],音同 cute) 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。

本章节详细介绍 QT QODBC 连接瀚高数据库。

调用关系

QT应用程序←→QODBC←→unixODBC←→HGDB ODBC

创建一个数据库连接需要三个操作:

  • 激活驱动程序
  • 设置连接信息
  • 打开连接

开发环境搭建

软件 版本
HGDB 安全版V4、企业版v5及以上版本
IDE Qt Creator 4.10.1

前提准备

  • ODBC数据源配置:配置方式参照 C\C++部分的ODBC,具体视windows环境、Linux环境操作
  • QT开发工具 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;

//新增数据
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!";
}

//查询数据
//可以复用上面的QSqlQuery对象,也可以重新new,复用的话需要先调用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;
}

//更新数据,如果不加where条件则表示更新整个表的数据
query.clear();
query.prepare("update student set name=:new_name where name=:name");
query.bindValue(":new_name","Qt2222");
query.bindValue(":name","Qt2");
//添加+删除+更新 数据只需要知道执行成功与否就行
if(query.exec())
{
qDebug() <<"update sucessful!";
}
else
{
qDebug() <<"update failed!";

}

//关闭数据库,程序自动关闭的时候也会关闭,所以只是用一个数据库的情况下无需手动关闭
db.close();

return a.exec();
}

执行结果:

图1:执行了add和update操作

image-20220516194854752

图2:显示为update操作执行后的结果

image-20220516195016937