Qt应用程序连接达梦数据库-飞腾PC麒麟V10

2024-02-26 11:40

本文主要是介绍Qt应用程序连接达梦数据库-飞腾PC麒麟V10,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

      • 前言
      • 1 安装ODBC
        • 1.1 下载unixODBC源码
        • 1.2 编译安装
        • 1.4 测试
      • 2 编译QODBC
        • 2.1 修改 qsqldriverbase.pri 文件
        • 2.2 修改 odbc.pro 文件
        • 2.3 编译并安装QODBC
      • 3 Qt应用程序连接达梦数据库测试
      • 4 优化ODBC配置,方便程序部署
        • 4.1 修改pro文件,增加DESTDIR 变量配置
        • 4.2 新建lib目录,拷贝驱动到工程目录下
        • 4.3 增加config目录,存放ODBC配置文件
        • 4.3 设置LD_LIBRARY_PATH 环境变量
        • 4.4 打包部署
      • 总结

前言

本文主要记录了在飞腾架构麒麟V10系统下开发Qt应用程序时,如何通过ODBC连接达梦数据库,将ODBC的两个配置文件作为应用程序配置文件的一部分随程序打包发布,并在程序中动态设置ODBC需要的环境变量。

1 安装ODBC

1.1 下载unixODBC源码

下载地址 https://www.unixodbc.org/download.html
解压 gunzip unixODBC*.tar.gz 或 tar xvf unixODBC*.tar

1.2 编译安装

打开终端,cd到unixODBC源码所在目录下,执行编译安装命令:

./configure
make
make install

默认安装路径为/usr/local ,当然了也可以通过./configure --prefix=/usr/local/unixODBC 来指定安装目录。默认安装完成如下图所示。
在这里插入图片描述

1.4 测试

首先添加两个环境变量,用终端打开.profile 文件,在最后增加两行

export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc

在终端执行source .profile命令使环境变量生效,飞腾PC麒麟V10需要重启生效。

修改odbc.ini文件,配置达梦数据库信息

[MAIN]
Description=DM ODBC DSN
Driver=MAIN ODBC DRIVER
SERVER=192.168.1.2
UID=SYSDBA
PWD=123456789
TCP_PORT=5236

[MAIN] <MAIN对应达梦数据库的表空间名>
Driver=<驱动程序名称,与odbcinst.ini文件中[MAIN ODBC DRIVER]名称对应>
SERVER=<数据库服务器地址>
UID=<数据库用户名>
PWD=<数据库用户密码>
TCP_PORT=<数据库服务器端口>

修改odbcinst.ini,配置达梦驱动

[MAIN ODBC DRIVER]
Description=ODBC DRIVER FOR MAIN
Driver=/dm/dmdbms/drivers/odbc/libdodbc.so

然后打开终端,将达梦数据库的odbc驱动和odbc动态库所在路径添加到LD_LIBRARY_PATH环境变量中,如果没有安装达梦数据库驱动,可以参考这篇文章来安装 飞腾架构麒麟V10安装达梦数据库客户端。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm/dmdbms/drivers/odbc:/usr/local/lib

设置好环境变量后,下面测试连接达梦数据库,cd到/usr/local/bin目录下,执行下面的命令,如果显示如下图所示的信息则表示连接成功。

isql -v MAIN 

在这里插入图片描述

2 编译QODBC

这里使用之前搭建麒麟开发环境时的Qt源码及编译好的qmake来编译QODBC,在麒麟V10环境下编译Qt,可以参考这篇文章,博客链接。qodbc在源码中的目录为 qt5.12.7/qtbase/src/plugins/sqldrivers/odbc

2.1 修改 qsqldriverbase.pri 文件

将原来的include 一行用#注释,改为下图红框中第二行所示的代码,因为qtsqldrivers-config.pri 文件中把odbc的编译设置为disable了
在这里插入图片描述

2.2 修改 odbc.pro 文件

把QMAKE_USE一行用#注释掉
在这里插入图片描述

2.3 编译并安装QODBC

可以使用QtCreator,也可以直接用命令编译,这里演示用命令编译QODBC。从 1.2 节知道unixODBC安装在/usr/local 目录下,编译qodbc需要用到unixODBC的头文件和动态库。在qodbc源码目录下打开终端,执行下面的命令后可生成libqsqlodbc.so库,并安装到qt安装目录的plugins/sqldrviers目录下。

../../../../bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lodbc" odbc.promake
make install

在这里插入图片描述

3 Qt应用程序连接达梦数据库测试

新建Qt工程,pro文件如下

QT       += core gui sql network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \main.cpp \mainwindow.cpp
HEADERS += \mainwindow.h
FORMS += \mainwindow.ui

在mainwindow.cpp中添加测试代码

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
#include <QSqlQuery>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << QSqlDatabase::drivers();QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");db.setHostName("192.168.1.2");db.setPort(5236);QString dsn=QString::fromLocal8Bit("DRIVER={MAIN ODBC DRIVER};SERVER=192.168.1.2;DATABASE=MAIN");db.setDatabaseName(dsn);//db.setDatabaseName("MAIN");   //这里数据库名要设置成上面odbc.ini配置文件中的MAIN,即表空间名db.setUserName("SYSDBA");db.setPassword("123456789");if (db.open()){qDebug() << "connect ok!";}else{qDebug() << "connect fail! " << db.lastError().text();}QSqlQuery query;QString strsql = "select name from Category";if (query.exec(strsql)){qDebug() << "select ok!";}else{qDebug() << "select fail! " << query.lastError().text();}while (query.next()){qDebug() << query.value(0).toString();}query.clear();
}

运行程序,通过观察打印日志,可以看到已经成功连接到达梦数据库,并查询到了数据。

4 优化ODBC配置,方便程序部署

为了程序部署时不用在每台电脑安装ODBC环境,现对ODBC的配置进行优化。先删除之前添加到.profile文件中的环境变量ODBCINI、ODBCSYSINI,以免影响测试结果。

4.1 修改pro文件,增加DESTDIR 变量配置
DESTDIR = $$PWD/bin
4.2 新建lib目录,拷贝驱动到工程目录下

然后在bin目录下新建lib目录,将ODBC的动态库及达梦的odbc驱动都复制到lib目录下
在这里插入图片描述

4.3 增加config目录,存放ODBC配置文件

在bin目录下新建config目录,并将odbc.ini 和 odbcinst.ini复制到config目录下,因为odbcinst.ini文件中指定了ODBC驱动的绝对路径,因此要在程序中动态修改odbcinst.ini文件内容。下面的代码演示了在main.cpp中动态设置环境变量 ODBCINI、ODBCSYSINI。

#include "mainwindow.h"#include <QApplication>
#include <QProcessEnvironment>
#include <QFileInfo>
#include <QLibrary>
#include <QSettings>
#include <QFile>
#include <QtDebug>
#include <QByteArray>void envConfig(const QString &appPath)
{//设置ODBC环境变量
#ifdef linux//这里的设置都是打包后路径的设置QString odbcdriver = "libdodbc.so";QString odbcIni = appPath + "/config/odbc.ini";QString odbcsysini = appPath + "/config";QString librarypath = appPath + "/lib";//重新设置ODBC驱动路径QString odbcInstIni = appPath + "/config/odbcinst.ini";QFile odbcinstFile(odbcInstIni);if(odbcinstFile.open(QIODevice::ReadOnly)){QByteArray byteArr = odbcinstFile.readAll();int index = byteArr.indexOf("Driver") + sizeof ("Driver");int len = byteArr.size() - index;byteArr.replace(index, len, odbcdriver.prepend(librarypath + "/").toLocal8Bit().data());odbcinstFile.close();if(odbcinstFile.open(QIODevice::WriteOnly)){odbcinstFile.write(byteArr);odbcinstFile.close();}}//settings.setValue("ZODA ODBC DRIVER/Driver", odbcdriver.prepend(librarypath + "/"));//设置ODBC环境变量setenv("ODBCINI", odbcIni.toLocal8Bit().data(), 0);setenv("ODBCSYSINI", odbcsysini.toLocal8Bit().data(), 0);
#endif
}int main(int argc, char *argv[])
{QString appFilePath = QString(argv[0]);QFileInfo appFileInfo(appFilePath);qDebug() <<  appFileInfo.absolutePath();envConfig(appFileInfo.absolutePath());QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
4.3 设置LD_LIBRARY_PATH 环境变量

经过上面的调整之后,要想成功连接数据库,需要将bin/lib目录添加到LD_LIBRARY_PATH 变量中,以便程序能正确找到驱动所在位置。设置好环境变量再次运行程序,就能正常连接达梦数据库了。
在这里插入图片描述

4.4 打包部署

这里使用linuxdeployqt进行打包,使用默认命令打包不会将/bin/lib目录下的odbc相关动态库拷贝到程序包的lib目录下的,这里需要手动拷贝bin/config 和 /bin/lib文件到程序包目录下。这时可以双击程序图标运行程序。如何在飞腾PC麒麟V10系统下安装使用linuxdeployqt打包工具可以参考这篇文章linuxdeployqt打包参考

总结

以上就是本文的所有内容了,对本文内容有疑问的朋友欢迎留言讨论!可在此处下载本文demo源码连接。

这篇关于Qt应用程序连接达梦数据库-飞腾PC麒麟V10的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748755

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad