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

目录

      • 前言
      • [1 安装ODBC](#1 安装ODBC)
        • [1.1 下载unixODBC源码](#1.1 下载unixODBC源码)
        • [1.2 编译安装](#1.2 编译安装)
        • [1.4 测试](#1.4 测试)
      • [2 编译QODBC](#2 编译QODBC)
        • [2.1 修改 qsqldriverbase.pri 文件](#2.1 修改 qsqldriverbase.pri 文件)
        • [2.2 修改 odbc.pro 文件](#2.2 修改 odbc.pro 文件)
        • [2.3 编译并安装QODBC](#2.3 编译并安装QODBC)
      • [3 Qt应用程序连接达梦数据库测试](#3 Qt应用程序连接达梦数据库测试)
      • [4 优化ODBC配置,方便程序部署](#4 优化ODBC配置,方便程序部署)
        • [4.1 修改pro文件,增加DESTDIR 变量配置](#4.1 修改pro文件,增加DESTDIR 变量配置)
        • [4.2 新建lib目录,拷贝驱动到工程目录下](#4.2 新建lib目录,拷贝驱动到工程目录下)
        • [4.3 增加config目录,存放ODBC配置文件](#4.3 增加config目录,存放ODBC配置文件)
        • [4.3 设置LD_LIBRARY_PATH 环境变量](#4.3 设置LD_LIBRARY_PATH 环境变量)
        • [4.4 打包部署](#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源码所在目录下,执行编译安装命令:

bash 复制代码
./configure
make
make install

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

1.4 测试

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

bash 复制代码
export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc

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

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

bash 复制代码
[MAIN]
Description=DM ODBC DSN
Driver=MAIN ODBC DRIVER
SERVER=192.168.1.2
UID=SYSDBA
PWD=123456789
TCP_PORT=5236

MAIN\] \ Driver=\<驱动程序名称,与odbcinst.ini文件中\[MAIN ODBC DRIVER\]名称对应\> SERVER=\<数据库服务器地址\> UID=\<数据库用户名\> PWD=\<数据库用户密码\> TCP_PORT=\<数据库服务器端口\> 修改odbcinst.ini,配置达梦驱动 ```bash [MAIN ODBC DRIVER] Description=ODBC DRIVER FOR MAIN Driver=/dm/dmdbms/drivers/odbc/libdodbc.so ``` 然后打开终端,将达梦数据库的odbc驱动和odbc动态库所在路径添加到LD_LIBRARY_PATH环境变量中,如果没有安装达梦数据库驱动,可以参考这篇文章来安装 [飞腾架构麒麟V10安装达梦数据库客户端](https://blog.csdn.net/zheng19880607/article/details/132221872)。 ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/dm/dmdbms/drivers/odbc:/usr/local/lib ``` 设置好环境变量后,下面测试连接达梦数据库,cd到/usr/local/bin目录下,执行下面的命令,如果显示如下图所示的信息则表示连接成功。 ```bash isql -v MAIN ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1702668370748379138/f7a768d2b7a34eb68a5aadc9e86cc453.png) ### 2 编译QODBC 这里使用之前搭建麒麟开发环境时的Qt源码及编译好的qmake来编译QODBC,在麒麟V10环境下编译Qt,可以参考这篇文章,[博客链接](https://blog.csdn.net/zheng19880607/article/details/132221054?spm=1001.2014.3001.5502)。qodbc在源码中的目录为 qt5.12.7/qtbase/src/plugins/sqldrivers/odbc #### 2.1 修改 qsqldriverbase.pri 文件 将原来的include 一行用#注释,改为下图红框中第二行所示的代码,因为qtsqldrivers-config.pri 文件中把odbc的编译设置为disable了 ![在这里插入图片描述](https://file.jishuzhan.net/article/1702668370748379138/5ac92149e39e424fbf2ce43b33a8eb67.png) #### 2.2 修改 odbc.pro 文件 把QMAKE_USE一行用#注释掉 ![在这里插入图片描述](https://file.jishuzhan.net/article/1702668370748379138/0f20ca0fb9c6492db04016bbb11f7e8f.png) #### 2.3 编译并安装QODBC 可以使用QtCreator,也可以直接用命令编译,这里演示用命令编译QODBC。从 1.2 节知道unixODBC安装在/usr/local 目录下,编译qodbc需要用到unixODBC的头文件和动态库。在qodbc源码目录下打开终端,执行下面的命令后可生成libqsqlodbc.so库,并安装到qt安装目录的plugins/sqldrviers目录下。 ```bash ../../../../bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lodbc" odbc.pro make make install ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1702668370748379138/b3124dec88b54d82936bb551ebf95f5e.png) ### 3 Qt应用程序连接达梦数据库测试 新建Qt工程,pro文件如下 ```bash 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中添加测试代码 ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include 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 变量配置 ```bash DESTDIR = $$PWD/bin ``` #### 4.2 新建lib目录,拷贝驱动到工程目录下 然后在bin目录下新建lib目录,将ODBC的动态库及达梦的odbc驱动都复制到lib目录下 ![在这里插入图片描述](https://file.jishuzhan.net/article/1702668370748379138/81149cb6a32e44ef8f5388e66be07017.png) #### 4.3 增加config目录,存放ODBC配置文件 在bin目录下新建config目录,并将odbc.ini 和 odbcinst.ini复制到config目录下,因为odbcinst.ini文件中指定了ODBC驱动的绝对路径,因此要在程序中动态修改odbcinst.ini文件内容。下面的代码演示了在main.cpp中动态设置环境变量 ODBCINI、ODBCSYSINI。 ```cpp #include "mainwindow.h" #include #include #include #include #include #include #include #include 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 变量中,以便程序能正确找到驱动所在位置。设置好环境变量再次运行程序,就能正常连接达梦数据库了。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1702668370748379138/454c10c3e7f2483cb8f92de83e55a8ef.png) #### 4.4 打包部署 这里使用linuxdeployqt进行打包,使用默认命令打包不会将/bin/lib目录下的odbc相关动态库拷贝到程序包的lib目录下的,这里需要手动拷贝bin/config 和 /bin/lib文件到程序包目录下。这时可以双击程序图标运行程序。如何在飞腾PC麒麟V10系统下安装使用linuxdeployqt打包工具可以参考这篇文章[linuxdeployqt打包参考](https://blog.csdn.net/zheng19880607/article/details/132265337?spm=1001.2014.3001.5502) ### 总结 以上就是本文的所有内容了,对本文内容有疑问的朋友欢迎留言讨论!可在此处下载本文demo源码[连接](https://download.csdn.net/download/zheng19880607/88317396)。

相关推荐
低头专研1 小时前
Markdown标题序号处理工具——用 C 语言实现
c语言·开发语言·typora·markdown文件标题编号·md文件标题序号
酱学编程3 小时前
redis 延迟双删
数据库·redis·缓存
刚入门的大一新生3 小时前
C++初阶-C++入门基础
开发语言·c++
你是理想3 小时前
wait 和notify ,notifyAll,sleep
java·开发语言·jvm
forestsea3 小时前
Python进阶编程总结
开发语言·python·notepad++
q567315234 小时前
使用Java的HttpClient实现文件下载器
java·开发语言·爬虫·scrapy
xujiangyan_4 小时前
MySQL的半同步模式
数据库·git·mysql
weixin_428498494 小时前
Visual Studio 中使用 Clang 作为 C/C++ 编译器时,设置优化选项方法
c语言·c++·visual studio
飞翔沫沫情4 小时前
《MySQL 5.7.44审计合规实践:插件集成与日志分割自动化方案》
数据库·mysql·mysql审计
MXsoft6184 小时前
云原生运维在 2025 年的发展蓝图
运维·服务器·数据库