Linux Qt连接达梦数据库

news2024/12/26 23:17:26

       最近因为工作需要,需要使用Qt连接达梦数据库,在Linux上比较麻烦,首先需要自己编译UnixODBC和Qt的QODBC库,其次还有各种环境配置。这里在安装好后记录一下,以后找起来方便。

        先说下我的电脑是麒麟V10系统+飞腾的CPU,Qt的版本是5.9.9,编译Qt的源码的文章可以看我的另一篇文章:银河麒麟V10 + 飞腾CPU编译安装 Qt5.9.9_Sakuya__的博客-CSDN博客_中标麒麟安装qt5.9

 


ODBC的安装和配置

        官网下载UnixODBC:unixODBC

        解压下载的压缩包:

tar -zxvf unixODBC-2.3.11.tar.gz

        配置configure文件,通过--prefix设置安装的目录:

cd unixODBC-2.3.11/
./configure –prefix /usr/local

        编译:

Make install

        安装:

Make install

         安装完后会在安装目录下的etc目录中生成odbc.ini odbcinst.ini两个配置文件,可以使用下面的命令查看配置文件的路径:

odbcinst -j

        如果查看的配置文件的路径和实际所在的路径不同的话,需要重新配置ODBCINIODBCSYSINI两个环境变量,使用命令:

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

        执行这两个命令只是临时设置了路径,重启电脑时还需要再设置一遍,想要永久设置,修改/etc/profile文件,把这两行加到文件末尾,然后执行source /etc/profile使设置生效。

        修改驱动信息,/usr/local/etc/odbcinst.ini做如下修改:

[DM8 ODBC DRIVER]

Description = ODBC DRIVER FOR DM8

Driver=usr/local/DM8/bin/libdodbc.so

        /usr/local/etc/odbc.ini做如下修改 

[DM8]

Description = DM ODBC DSN

Driver = DM8 ODBC DRIVER

SERVER = localhost

UID = SYSDBA

PWD = SYSDBA

TCP_PORT= 5236

        这里红色标出的几个地方需要一样,最好设置成和你的数据库名一样,否则在Qt连接数据库的时候会因为数据库名不对报错。

        修改好后,可以使用下面的命令测试是否能连接成功,下图是连接成功的提示:

isql dm8 -v

        如果出现下面的报错,说找不到libdodbc.so,是因为libdodbc.so依赖的库文件没找到,可以把/usr/local/DM8/bin下的libdmdpi.so和libdmfldr.so这两个libdodbc.so依赖的库复制到/usr/lib

        如果报错不能加载libodbcinst.so,可以把/usr/local/lib下的libodbcinst.so复制到/usr/lib目录下


 编译QODBC

        在Linux系统中,由于没有自带ODBC驱动,所以编译Qt源码时,也不会自动编译QODBC,需要自己包含上UnixODBC的头文件然后编译,再把libqsqlodbc.so拷贝到Qt的路径下。没有这个库的话,在调用QSqlDatabase::addDatabase("QODBC")的时候会报错,告诉你缺少QODBC驱动。

        首先进入Qt的源码路径下的qtbase/src/plugins/sqldrivers,修改里面的qsqldriverbase.pri文件,修改include的路径为下图中的路径:

         再进入Qt的源码路径下的qtbase/src/plugins/sqldrivers/odbc,修改里面的odbc.pro文件,注释掉里面的QMAKE_USE += odbc

         然后进入Qt的安装目录下的bin目录,也就是你的qmake所在的目录,执行:

/usr/local/Qt-5.9.9/bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lodbc" /home/kd1/Qt_Source/qt-everywhere-opensource-src-5.9.9/qtbase/src/plugins/sqldrivers/odbc/odbc.pro

        如果编译时报如下错误:

cannot write cache file /home/lh/qtexample/qt-5.13.0/gui/analogclock/.qmake.stash: permission denied

        说明文件夹权限是加密的,你需要修改其权限:进入项目对应的文件夹,修改其文件和子文件的权限为可读可写可执行:

sudo chmod 777  *  -R

        执行完qmake的命令后,会生成一个MakeFile文件,然后执行make即可。默认编译好生成的libqsqlodbc.so文件会放在/plugins/sqldrives下,然后我们把它复制或移动到Qt安装目录下的plugins/sqldrives下就可以了,执行命令:

mv -f /plugins/sqldrives/libqsqlodbc.so /usr/local/Qt-5.9.9/ plugins/sqldrives

        到这里就算是编译完成QODBC了。


Qt连接达梦数据库

   首先先要在pro文件中加入:

QT += sql

        连接数据库:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("localhost");
db.setPort(5236);
db.setDatabaseName("DM8");            //这里数据库名要设置成上面配置文件中的红色字体
db.setUserName("SYSDBA");
db.setPassword("SYSDBA");
if (db.open())
{
    qDebug() << "connect ok!";
}
else
{
    qDebug() << "connect fail! " << db.lastError().text();
}

        在Qt连接数据库时,如果出现报错:

[Driver Manager] Data source name not found and no default driver specified QODBC3: Unable to connect

        说明setDatabaseName数据库名设置的不对,这里的数据库名不是你要连接的数据库名,而是DSN名。DSN名就是上面配置文件中我标记出来的红色字体,检查odbc.ini和odbcinst.ini中的配置。

         清空表,初始化测试环境:

QSqlQuery query;

QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY";
if(query.exec(strsql))
{
    qDebug() << "delete ok!";
}
else
{
    qDebug() << "delete fail! " << query.lastError().text();
}
query.clear();

        插入数据:

QSqlQuery query;

QString strsql = "insert into PRODUCTION.PRODUCT_CATEGORY(NAME) values('语文'), ('数学'), ('英语'), ('体育')";
if (query.exec(strsql))
{
    qDebug() << "insert ok!";
}
else
{
    qDebug() << "insert fail! " << query.lastError().text();
}
query.clear();

        删除数据:

QSqlQuery query;

QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY where name='数学'";
if (query.exec(strsql))
{
    qDebug() << "delete ok!";
}
else
{
    qDebug() << "delete fail! " << query.lastError().text();
}
query.clear();

        更新数据:

QSqlQuery query;

QString strsql = "update PRODUCTION.PRODUCT_CATEGORY set name = '英语—新课标' where name='英语';";
if (query.exec(strsql))
{
    qDebug() << "update ok!";
}
else
{
    qDebug() << "update fail! " << query.lastError().text();
}
query.clear();

        查询数据:

QSqlQuery query;

QString strsql = "select name from PRODUCTION.PRODUCT_CATEGORY";
if (query.exec(strsql))
{
    qDebug() << "select ok!";
}
else
{
    qDebug() << "select fail! " << query.lastError().text();
}
while (query.next())
{
    qDebug() << query.value(0).toString().toStdString().c_str();
}
query.clear();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共享SimpleDateFormat的并发问题

1、问题提出 梳理订单逻辑时发现对日期格式进行format的代码有如下写法 OneDateUtil中定义了一个全局static的SimpleDateFormat对象。SimpleDateFormat对象不是线程安全的&#xff0c;在多线程环境下容易造成数据转换和处理错误。 2、为什么SimpleDateFormat线程不安全 Sim…

[附源码]Node.js计算机毕业设计红色景点自驾游网站管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

MySQL~索引

7、索引 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 提取句子主干&#xff0c;就可以得到索引的本质&#xff1a;索引是数据结构。 7.1、索引的分类 在一个表中&#xff0c;主键索引只能有一个&#xff0c;唯一…

微机原理与接口技术笔记(持续更新)

文章目录前言储存系统与技术材料高速储存器缓冲储存器&#xff08;Cache&#xff09;材料&#xff0c;局部性&#xff0c;访问方式Cache全相联映射Cache交换与一致性单核CPU一致性处理多核CPU的MESI协议主储存器&#xff08;内存&#xff09;主要技术指标容量带宽内存模组与内存…

机器学习100天(九):009 多项式回归理论

机器学习100天,今天讲的是:多项式回归理论! 在前两期视频我们讲解了简单线性回归理论,并解决了一个房价预测的问题,建立了一个房价与地区人口的线性关系。然而,如果数据的分布不是简单的线性关系,又该怎么做呢? 一、多项式回归 我们来看一个例子,在这个二维平面上,…

【蓝桥杯】砝码称重

3417. 砝码称重 - AcWing题库 题意&#xff1a; 思路回顾&#xff1a; 首先这道题一开始我没想用DP做&#xff0c;看到标签是入门题就没想DP qwq 其实这就是一个普通背包 一开始设计状态设计不出来&#xff0c;刚开始设的是dp[i][j]表示前i个物品能表示j种重量 显然是不行…

计算机毕业设计django基于python商品比价平台

项目介绍 随着计算机技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的商品比价系统的平台,这样可以有效地解决数据商品比价系统混乱的局面。 本文首先介绍了商品比价系统的发展背景与发展现状,…

年后面试,给你提6点建议!

你好&#xff0c;我是田哥转眼年底&#xff0c;很大部分人都在观望&#xff0c;甚至已经开始着手准备明年的面试了&#xff0c;不知道屏幕前的你是如何打算的&#xff1f;从现在开始&#xff0c;到明年三月份还有两个多月的时间&#xff0c;时间不多&#xff0c;但也不少了。只…

优秀的后端应该有哪些开发习惯?

见识过各种各样的代码,优秀的、垃圾的、不堪入目的、看了想跑路的等等,所以这篇文章记录一下一个优秀的后端 Java 开发应该有哪些好的开发习惯。 拆分合理的目录结构 受传统的 MVC 模式影响,传统做法大多是几个固定的文件夹 controller、service、mapper、entity,然后无限…

CentOS7 离线部署 PostgreSQL12

CentOS7 离线部署 PostgreSQL12下载资源包部署、启动配置服务创建用户及数据库下载资源包 下载地址 https://www.postgresql.org/download/选择系统 3. 拉到最下边点击direct download 4. 选择需要的版本 5. 点击Avaliable Groups下的链接 6. 下载postgresql*、postgresql*-…

基于android的共享单车系统

效果展示&#xff1a; 需求信息&#xff1a; 客户端&#xff1a; 1&#xff1a;登录注册&#xff1a;用户可以通过自己的信息进行账号的注册 2&#xff1a;附近单车&#xff1a;显示 附近的共享单车租赁点 3&#xff1a;单车开锁&#xff1a;扫码或者输入编号开锁 4&#xff1a…

简单DP+最长上升子序列

简单DP最长上升子序列 文章目录简单DP最长上升子序列比较简单的DP[1027. 方格取数](https://www.acwing.com/problem/content/1029/)题解[275. 传纸条](https://www.acwing.com/problem/content/277/)题解最长上升子序列[AcWing1014. 登山](https://www.acwing.com/problem/con…

20.Django大型电商项目之登录页面、如何使用图片验证码

1. 登录页面 1.1 基础搭建 templates <!-- netshop\userapp\templates\userapp\login.html --> {% extends base.html %} {% block title %}用户登录页面{% endblock %}{% load static %} {% block headerjs %} <script type"text/javascript" src"…

Allegro打散Group的两种方法操作指导

Allegro打散Group的两种方法操作指导 Allegro可以建一个Group,也可以打散一个Group,当不需要器件,过孔走线等等以一个group形式体现,可以用下面的操作打散,具体操作如下 举例需要将这个Group打散 选择setup-application Mode-placement edit模式 Find选择Groups 鼠标移…

基于Geehy APM32F4移植使用letter-shell命令行终端

1. letter-shell简介 letter shell是一个C语言编写的&#xff0c;可以嵌入在程序中的嵌入式shell&#xff0c;主要面向嵌入式设备。 说得直白点他就是一个命令行交互软件&#xff0c;可以读取用户输入的命令&#xff0c;找到并执行命令对应的函数。 letter-shell的功能十分强…

C# 绘图基本方法

一得到Graphics对象 1 OnPaint事件中使用 Protected overrid void OnPaint(PaintEventArgs e) {Graphics ge.Graphics;...... }2 其他情况实现 Graphics gthis.CreaateGraphics();二 关于Graphics的释放 1 对于CreateGraphics&#xff08;&#xff09;得到的Graphics对象&a…

VC++开发一个资源编辑器-1.拖动控件

我想要做一个代码生成向导&#xff0c;首先要实现的功能 &#xff0c;是自动生成界面。 要实现以上的功能&#xff0c;第1步要实现&#xff0c;对界面上各个控件的拖动&#xff0c;移动&#xff0c;缩放的功能。 今天完成了初步的代码实现。 最要的功能实现 与备忘在这里写一…

【MQTT】mqtt 服务器部署--go 生产和消费demo

1. 背景 Golang 是谷歌开发的一种静态强类型、编译、并发和垃圾收集编程语言。围棋富有表现力&#xff0c;干净&#xff0c;高效。它的并发机制使得编写最大限度地利用多核和网络机器的程序变得容易&#xff0c;它的创新类型系统使得灵活和模块化的程序构造成为可能。Go 可以快…

【博客561】利用隧道和conntrack实现NAT网关

利用隧道和conntrack实现NAT网关 场景&#xff1a;实现一个NAT网关来转发其它node的出外网流量 如&#xff1a;图中的2节点充当NAT网关来转发1的出外网流量 利用隧道和conntrack实现NAT网关 节点ip&#xff1a; node1是172.17.158.48&#xff0c;node2是172.17.158.46 1、配…

Clipper库 | 类型和填充规则

裁剪类型(ClipType) CT_INTERSECTION 0 CT_UNION 1 CT_DIFFERENCE 2 CT_XOR 3交集&#xff0c;AND (intersection) &#xff1a;主体和裁剪多边形相交的区域。并集&#xff0c;OR (union) - 主体和裁剪多边形两者合并的区域。非/差&#xff0c;NOT (difference) - 裁剪多边…