原文链接
1.QT5.14下OCI驱动编译完整步骤
1.安装qt的时候手动选择安装源码资源(默认不安装Source的)

2.进入QT安装目录下E:\Qt5.14\5.14.0\Src\qtbase\src\plugins\sqldrivers\oci

双击用qtcreator打开oci.pro文件
进行如下图片内对oci.pro的修改
前提准备:
找到本地oracle客户端的目录 例如:C:\Oracle\instantclient_11_2
(温馨提示:oracle客户端的版本不能比oracle服务端的低)

3.构建项目产生如下错误:’OCIBindByPos2’ was not declared in this scop

4.双击错误可以进入错误显示在qsql_oci.cpp文件的1559行

5.错误原因以及解决方式

新的OCIBindByPos2()函数和以前的OCIBindByPos()函数产生出入
新版本OCIBindByPos2()函数第九个参数的数据类型是ub4*
旧版本OCIBindByPos()函数第九个参数的数据类型是ub2*
故此进行一个强制类型转化,将新版的第九个参数改位ub2*类型即可,同时函数名也要改为旧版本。
1
2
3
4

6.进行项目构建,产生的驱动程序在qt所在盘符下的plugins目录下的sqldrivers目录中

注意并不是在qt的目录下,如下图所示

7.将这产生的几个文件拷贝到Qt下你所用编译器下即可,如下所示

8.如果使用驱动失败(连接Oracle数据库失败)
问题:可能是Oracle客户端的oci.dll动态库识别不到
解决方案两个:
一、可以将Oracle客户端的oci.dll动态库所在的文件夹的绝对路径添加到系统环境变量当中。
二、可以将Oracle客户端的oci.dll动态库直接拷贝到qt项目下
三、可以在qt中直接加载Oracle客户端oci.dll动态库,如下操作

//使用的时候要加入头文件 #include
QLibrary *joker_lib = NULL;
joker_lib = new QLibrary(“C:\Oracle\instantclient_11_2\oci.dll”);
joker_lib->load();
if(!joker_lib->isLoaded()){
qDebug()<<“动态库没有被加载!”;
return -1;
}
1
2
3
4
5
6
7
8
2. qt中的数据库操作
// 需要添加的模块
QT += sql
1
2
创建数据库实例, 并且登录数据库 -> QSqlDataBase

// 得到不同的数据库驱动的名字, 如果能得到数据库对应的驱动名说明支持, 如果得不到, 说明不支持连接该数据库
// (“QSQLITE”, “QMYSQL”, “QMYSQL3”, “QOCI”, “QOCI8”, “QODBC”, “QODBC3”, “QPSQL”, “QPSQL7”)
[static] QStringList QSqlDatabase::drivers();
// 添加一个数据库实例
// 连接oracle 需要的驱动名 – QOCI
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ));
参数:
- type: 指定要连接什么样的数据库, 这个字符串是数据库驱动的名字
- connectionName: 数据库连接名, 使用这个名字区分不同的数据库
返回值: 得到一个数据库实例

// 设置数据库的连接信息
// 用户名, 密码, 数据库实例名, 数据库的IP, 数据库的端口
// 设置用户名
void QSqlDatabase::setUserName(const QString &name);
// 设置密码
void QSqlDatabase::setPassword(const QString &password);
// 设置数据库实例名
void QSqlDatabase::setDatabaseName(const QString &name);
// 设置数据库的IP
// 参数: IP/域名
// 本地连接使用域名: localhost == “127.0.0.1”
// 域名需要绑定IP地址
void QSqlDatabase::setHostName(const QString &host);
// 设置数据库的端口
// 连接数据库的时候这个函数一般不需要调用, 如果数据库服务器绑定的不是默认端口, 需要调用该函数
void QSqlDatabase::setPort(int port);

// 连接/登录/打开数据
// 登录成功: true, 失败: false
bool QSqlDatabase::open();
// 如果登录失败, 获取错误信息
QSqlError QSqlDatabase::lastError() const;
QString QSqlError::text() const;

// 事务操作
// 开启一个事务
bool QSqlDatabase::transaction();
// 提交数据
bool QSqlDatabase::commit();
// 数据回滚
bool QSqlDatabase::rollback();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 示例程序
// 打印支持的数据库的驱动
qDebug() << QSqlDatabase::drivers();
// 创建数据库实例
QSqlDatabase db = QSqlDatabase::addDatabase(“QOCI”);
// 设置连接信息
db.setHostName(“192.168.xxx.xxx”);
db.setDatabaseName(“orcl”);
db.setUserName(“scott”);
db.setPassword(“tiger”);

// 连接数据库
bool bl = db.open();
if(!bl)
{
qDebug() << “连接数据失败” << db.lastError().text();
}
else
{
qDebug() << “连接数据成功”;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
用于执行sql语句的类 -> QSqlQuery

// 常用的构造函数
QSqlQuery::QSqlQuery(const QString &query = QString(), QSqlDatabase db = QSqlDatabase())
参数:
- query: 即将要被执行的sql语句
- db: 数据库实例
// 设置并执行sql语句
// sql语句执行成功了:true, 失败: false
bool QSqlQuery::exec(const QString &query);
bool QSqlQuery::exec();

// 如果执行的查询的语句, 会的得到一个结果集, 这个结果集在 QSqlQuery 对象内部
// 如何遍历结果集?
// 如果得到一个条记录返回: true, 否则: false
bool QSqlQuery::next();
while(q->next())
{
// 将当前记录的字段值取出
}

// 如何将当前记录的字段值取出?
// 参数 index -> 字段的下标(编号), 第一个字段用0表示
QVariant QSqlQuery::value(int index) const;
// 参数: name: 字段的名字
QVariant QSqlQuery::value(const QString &name) const;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
示例代码

// 打印支持的数据库的驱动
qDebug() << QSqlDatabase::drivers();
// 创建数据库实例
QSqlDatabase db = QSqlDatabase::addDatabase(“QOCI”);
// 设置连接信息
db.setHostName(“192.168.xxx.xxx”);
db.setDatabaseName(“orcl”);
db.setUserName(“scott”);
db.setPassword(“tiger”);

// 连接数据库
bool bl = db.open();
if(!bl)
{
qDebug() << “连接数据失败” << db.lastError().text();
}
else
{
qDebug() << “连接数据成功”;
}

// 对数据操作使用sql语句
// 创建一个操作sql语句的类
QSqlQuery query;
QString sql = “select * from dept”;
bl = query.exec(sql);
if(bl == false)
{
qDebug() <<“查询失败…”;
return;
}
// 遍历结果集
while(query.next())
{
// 将当前记录的字段值取出
qDebug() << "编号: " << query.value(“deptno”).toInt()
<< ", 姓名: " << query.value(“dname”).toString()
<< ", 位置: " << query.value(“loc”).toString();
}

// 开启一个事务
db.transaction();
sql = “insert into dept values(01, ‘Joker’, ‘上海’)”;
bl = query.exec(sql);
if(bl)
{
// 提交数据
db.commit();
}
else
{
// 数据回滚
db.rollback();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
qt连接mysql数据错误信息

// “Driver not loaded Driver not loaded”
/*
原因: 并不是qt中没有mysql驱动, 缺的是一个mysql的动态库
这个动态库是怎么得到的?
- windows上需要安装mysql, mysql的安装目录
C:\Program Files (x86)\MySQL\MySQL Server 5.7\lib\libmysql.dll
需要将这个动态库拷贝到qt的编译套件的bin目录:
C:\Qt\Qt5.9.3\5.9.3\mingw53_32\bin

如果Qt编译套件是32位, libmysql.dll 应该是32位
如果Qt编译套件是64位, libmysql.dll 应该是64位

*/

QT5.14.1+Win7 64+Oracle11gR2 Qt连接数据库的更多相关文章

  1. ubuntu18.04.3新装系统安装QT5.14.1和环境配置

    第一步:下载QT: http://download.qt.io/archive/qt/ 或者 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/ 下 ...

  2. 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...

  3. win7 64 + Ubuntu 14.04.1 64双系统安装,详解UEFI ~ GPT和legacy ~ MBR区别

    win7 64 + Ubuntu 14.04.1 64双系统安装 背景:我的笔记本之前的系统是window 7 64 + Ubuntu 14.04.1,用UEFI引导系统.安装过程是先装的win7,再 ...

  4. Win7 64位下配置Qt5.3和Wincap

         最近在学网络编程,想在windows下用Qt做个网络抓包工具,就要用到WinPcap,而我的电脑的系统是Win7 64位,qt版本是Qt 5.3.1 for Windows 64-bit ( ...

  5. 关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题

     关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题 在win7 64位系统安装VC2015的编译器,并安装了 Qt 5.6 -5.7 VC2015 64位版本测 ...

  6. QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置

    引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...

  7. Qt5.8 下链接 Mysql 错误以及解决方法(无论 Mysql 是什么版本的,64 位 Qt 要用 64 位的 Mysql 驱动,32 位的 Qt 要用 32 位的Mysql 驱动)

    Qt 5.8 下链接 Mysql(Windows 平台下),有朋友会出现一个这个无法连接的错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: ...

  8. Windows7 QT5.6.0(64位)使用mysql(64位)环境搭建详解

    1 说明 使用环境为:Windows7 VS2015 QT5.6.0(64位),MYSQL 5.7.13(64位). 网上各种错误.模糊.抽象的资料,配置环境花了半天,痛定思痛,总结出来,方便后来人. ...

  9. Win7 64位下PowerDesigner连接64位Oracle11g数据库

    操作系统:WIN7 64旗舰版 Oracle版本:64位11g PowerDesigner版本:15.1 问题描述:因为PowerDesigner是32的程序,连接数据库会默认开启32位的ODBC,因 ...

  10. 关于Win7 64位 mysql 5.7下载安装问题

    1.从官网下载mysql: 网址:http://dev.mysql.com/downloads/mysql/ 这是我们要找的,win7 64位 点击下载: 出现如图所示,我们不必要登录注册,点击红线内 ...

随机推荐

  1. Mac下如何添加User到group中

    原因: 使用mac的时候需要像linux一样对用户和群组进行操作,但是linux使用的gpasswd和usermod在mac上都不可以使用,mac使用dscl来对group和user操作. 介绍: $ ...

  2. NACOS MalformedInputException 无法读取中文配置问题

    1. 问题描述 在windows平台中打包运行springboot jar包提示如下错误 在idea中运行正常 org.yaml.snakeyaml.error.YAMLException: java ...

  3. [转]CMake与Make最简单直接的区别

    写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时就会特别麻烦 ...

  4. 跟着源码学IM(十二):基于Netty打造一款高性能的IM即时通讯程序

    本文由竹子爱熊猫分享,原题"(十一)Netty实战篇:基于Netty框架打造一款高性能的IM即时通讯程序",本文有修订和改动. 1.引言 关于Netty网络框架的内容,前面已经讲了 ...

  5. 【宝塔】搭建随机图API

    创建站点 首先,我们打开服务器的宝塔面板,如果没安装的推荐安装一个,因为这个对建站小白来说非常的方便. 我们参加一个 API 站点 然后到站点设置里申请一个 ssl 认证,再打开强制 https 添加 ...

  6. Docker Desktop 使用笔记

    一.Docker Desktop是什么? Docker Desktop是适用于Windows的Docker桌面,是Docker设计用于在Windows 10上运行.它是一个本地 Windows 应用程 ...

  7. 记录小程序跳转h5,然后h5涉及下载文件的问题

    小程序跳转h5中,可以在小程序增加一个页面使用webView方式嵌套三方小程序,不过需要配置白名单 由于小程序的限制,不能在嵌套的h5中进行文件下载 网上也没有很好的解决方法,解决方法是再跳到小程序带 ...

  8. Java技术栈总结-基础

    - - -计算机技术演化- - -1 编程语言演化1.1 写在最前  此文用于个人总结,串接知识点 1.2 汇编  举例:mov .add  特点:程序量很大,几百行.几千行乃至几万行 1.3 VB- ...

  9. Nginx日常运维方法Linux版

    1,安装? 下载RPM:wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm 离线 ...

  10. VOLE+OKVS的PSI技术落地应用

    学习&转载文章:技术创新〡VOLE+OKVS的PSI技术落地应用 神谱科技基于VOLE+OKVS设计了两方PSI和多方PSI协议,并已应用于Seceum系列隐私计算产品中. Seceum并无开 ...