本章节详细介绍 QT QODBC 数据库编程连接,QT 为数据库编程提供了一个类似 JDBC 的统一操作模型,它的底层是具体数据库或数据库接口的插件,由它们负责完成真正的数据库操作。
QT 自带 QODBC Driver,在 Windows 平台上通过系统提供的 ODBC Driver 可以访问支持 ODBC 的数据库,如 Ms Access、SQLServer 等(Windows XP 自带 Access 和 SQL Server 的 ODBC Driver)。开发者通过 QODBC 接口连接 DM 数据库。
开发环境搭建
| 软件 |
版本 |
| DM 数据库 |
DM 8.0 及以上版本 |
| QT |
5.12.8 |
QT 开发环境搭建
请自行下载安装 QT5.12.8。
安装 DM 数据库
请参考 DM 数据库快速上手指南。
数据库安装过程中,请勾选创建 BOOKSHOP,DMHR 示例库,作为数据库模拟环境,如下图所示:

注册 ODBC 数据源
请参考 通过 ODBC 连接数据库章节。
数据库连接
QODBC 通过 ODBC 接口登录登出示例程序 qt_conn.c 如下:
#include <QCoreApplication> #include <QtSql> #include <QDebug> #include <QSqlDatabase>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setHostName("192.168.104.21"); db.setPort(51236); db.setDatabaseName("DM8"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); if (db.open()) qDebug() << "connect ok!"; else { qDebug() << "connect fail! " << db.lastError().text().toLatin1(); }
return a.exec(); }
|

开发示例
基本操作示例
QODBC 通过 ODBC 接口增、删、改、查四个基本操作,示例程序 qt_dml.c 如下:
#include <QCoreApplication> #include <QtSql> #include <QDebug> #include <QTextCodec>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setHostName("192.168.104.21"); db.setPort(51236); db.setDatabaseName("DM8"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); if (db.open()) qDebug() << "connect ok!"; else { qDebug() << "connect fail! " << db.lastError().text().toLatin1(); }
QSqlQuery query;
QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY"; query.exec(strsql);
strsql = "insert into PRODUCTION.PRODUCT_CATEGORY(NAME) values('语文'), ('数学'), ('英语'), ('体育')"; if (query.exec(strsql)) { qDebug() << "insert ok!"; } else { qDebug() << "insert fail! " << query.lastError().text(); getchar(); exit(-1); }
strsql = "delete from PRODUCTION.PRODUCT_CATEGORY where name='数学'"; if (query.exec(strsql)) { qDebug() << "delete ok!"; } else { qDebug() << "delete fail! " << query.lastError().text(); getchar(); exit(-1); }
strsql = "update PRODUCTION.PRODUCT_CATEGORY set name = '英语—新课标' where name='英语';"; if (query.exec(strsql)) { qDebug() << "update ok!"; } else { qDebug() << "update fail! " << query.lastError().text(); getchar(); exit(-1); }
strsql = "select name from PRODUCTION.PRODUCT_CATEGORY"; if (query.exec(strsql)) { qDebug() << "select ok!"; } else { qDebug() << "select fail! " << query.lastError().text(); getchar(); exit(-1); } while (query.next()) { qDebug() << query.value(0).toString().toStdString().c_str(); } query.clear();
return a.exec(); }
|

绑定变量示例
QODBC 通过 ODBC 接口绑定变量示例程序 qt_bind.c 如下:
#include <QCoreApplication> #include <QtSql> #include <QDebug> #include <QTextCodec>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setHostName("192.168.104.21"); db.setPort(51236); db.setDatabaseName("DM8"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); if (db.open()) qDebug() << "connect ok!"; else { qDebug() << "connect fail! " << db.lastError().text().toLatin1(); }
QSqlQuery query;
QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY"; query.exec(strsql);
strsql = "insert into PRODUCTION.PRODUCT_CATEGORY(name) values(?)"; query.prepare(strsql); query.bindValue(0, "物理"); if (query.exec()) { qDebug() << "insert ok!"; } else { qDebug() << "insert fail! " << query.lastError().text(); getchar(); exit(-1); }
strsql = "select name from PRODUCTION.PRODUCT_CATEGORY"; if (query.exec(strsql)) { qDebug() << "select ok!"; } else { qDebug() << "select fail! " << query.lastError().text(); getchar(); exit(-1); } while (query.next()) { qDebug() << query.value(0).toString().toStdString().c_str(); } query.clear();
return a.exec(); }
|

大字段操作示例
QODBC 通过 ODBC 接口大字段操作包括大字段的插入,查询等。示例程序 qt_lob.c 如下:
#include <QCoreApplication> #include <QtSql> #include <QDebug> #include <QTextCodec>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setHostName("192.168.104.21"); db.setPort(51236); db.setDatabaseName("DM8"); db.setUserName("SYSDBA"); db.setPassword("SYSDBA"); if (db.open()) qDebug() << "connect ok!"; else { qDebug() << "connect fail! " << db.lastError().text().toLatin1(); }
QSqlQuery query;
QString strsql = "drop table if exists qt_demo"; query.exec(strsql); strsql = "create table qt_demo(c1 int, c2 blob)"; query.exec(strsql);
QString f = "../qt_lob/file/DM8_SQL.pdf";
QByteArray mapData; QFile file(f); file.open(QIODevice::ReadOnly); mapData = file.readAll(); file.close();
query.prepare("INSERT INTO qt_demo values(?, ?)"); query.bindValue(0, 1); query.bindValue(1, mapData); if (!query.exec()) { qDebug() << query.lastError(); } else { qDebug() << "insert OK!"; }
QSqlQuery readquery;
QByteArray databa; if (readquery.exec("select c2 from provider_demo")) { QSqlRecord myrecord = readquery.record();
if (readquery.next()) { databa = readquery.value(myrecord.indexOf("C2")).toByteArray(); } }
QFile mybfile("../qt_lob/file/DM81_SQL.pdf"); mybfile.open(QIODevice::WriteOnly); mybfile.write(databa); mybfile.close(); qDebug() << "select OK!";
return a.exec(); }
|
