QODBC 编译

本章节详细介绍 QT QODBC 数据库编程连接,QT 为数据库编程提供了一个类似 JDBC 的统一操作模型,它的底层是具体数据库或数据库接口的插件,由它们负责完成真正的数据库操作。可进入达梦云适配中心下载试用下载 QT 接口源码。

QT 自带 QODBC Driver,在 Windows 平台上通过系统提供的 ODBC Driver 可以访问支持 ODBC 的数据库,如 Ms Access、SQL Server 等(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();
}

执行结果

微信扫码
分享文档
扫一扫
联系客服