暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM8达梦数据库QT 接口

原创 达梦 2021-01-31
4039

本章节详细介绍 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 数据库快速上手指南

数据库安装过程中,请勾选创建 BOOKSHOPDMHR 示例库,作为数据库模拟环境,如下图所示:

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);

// 读取文件数据,写入 lob 列
//选择要写入的文件
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!";
}

//读取 lob 列数据,写入到文件中
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();
}

执行结果

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论