QT5.14.1+Win7 64+Oracle11gR2 Qt连接数据库
原文链接
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连接数据库的更多相关文章
- ubuntu18.04.3新装系统安装QT5.14.1和环境配置
第一步:下载QT: http://download.qt.io/archive/qt/ 或者 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/ 下 ...
- 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包
Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...
- 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,再 ...
- Win7 64位下配置Qt5.3和Wincap
最近在学网络编程,想在windows下用Qt做个网络抓包工具,就要用到WinPcap,而我的电脑的系统是Win7 64位,qt版本是Qt 5.3.1 for Windows 64-bit ( ...
- 关于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位版本测 ...
- QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置
引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...
- Qt5.8 下链接 Mysql 错误以及解决方法(无论 Mysql 是什么版本的,64 位 Qt 要用 64 位的 Mysql 驱动,32 位的 Qt 要用 32 位的Mysql 驱动)
Qt 5.8 下链接 Mysql(Windows 平台下),有朋友会出现一个这个无法连接的错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: ...
- Windows7 QT5.6.0(64位)使用mysql(64位)环境搭建详解
1 说明 使用环境为:Windows7 VS2015 QT5.6.0(64位),MYSQL 5.7.13(64位). 网上各种错误.模糊.抽象的资料,配置环境花了半天,痛定思痛,总结出来,方便后来人. ...
- Win7 64位下PowerDesigner连接64位Oracle11g数据库
操作系统:WIN7 64旗舰版 Oracle版本:64位11g PowerDesigner版本:15.1 问题描述:因为PowerDesigner是32的程序,连接数据库会默认开启32位的ODBC,因 ...
- 关于Win7 64位 mysql 5.7下载安装问题
1.从官网下载mysql: 网址:http://dev.mysql.com/downloads/mysql/ 这是我们要找的,win7 64位 点击下载: 出现如图所示,我们不必要登录注册,点击红线内 ...
随机推荐
- Redis反序列化LocalDateTime时报错
今天在整合redis和spring boot的时候,遇到了一个错误,记录一下. 报错如下: Could not read JSON: Cannot construct instance of `jav ...
- Qt/C++编写手机版本视频播放器和Onvif工具(可云台和录像)
一.前言 用Qt+ffmpeg写播放器很多人有疑问,为何不用Qt自己的多媒体框架来写,最重要的原因是Qt自带的目前都依赖具体的本地解码器,如果解码器不支持,那就是歇菜的,最多支持个MP4格式,而且在手 ...
- Qt编写的项目作品12-简易视频播放器
一.功能特点 多线程实时播放rtsp视频流. 支持windows+linux+mac. 多线程显示图像,不卡主界面. 自动重连网络摄像头. 可设置边框大小即偏移量和边框颜色. 可设置是否绘制OSD标签 ...
- OpenWrt作为旁路由配置Wireguard 实现内网穿透
0. 前言 因为最近一直在折腾软路由相关的系统及配置,也在家里整了一套k8s的环境,有一定需求需要在外面去连这套k8s的环境作为开发环境的补充,虽然可以通过外网端口暴露的方式访问,但是还是觉得不太方便 ...
- 多语言越狱很棒!😊MULTILINGUAL JAILBREAK CHALLENGES IN🧜♀️LARGE LANGUAGE MODELS
写这篇的时候第一次认识到了附录内容的重要性(bushi只是这篇读了全部的附录),它可以让你明确文章全部的实验,并且其中包含很多辅助你对正文理解的表格 禁止盗用,侵权必究!!!欢迎大家积极举报
- Vue.js 监听属性的使用
示例源码: <div id = "computed_props"> 千米 : <input type = "text" v-model = & ...
- yarn : 无法加载文件 C:\Users\duany\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本
在win10 下安装yarn后,在编辑器中检查yarn的安装的时候会出现: 解决方法 1:搜索powershell,以管理员方式运行powershell2:使用命令更改计算机的执行策略 执行: set ...
- C#操作MySQL数据库——思路简单清晰
1.下载mysql.Data.dll,在解决方案->引用中引入,并在文件头部引入 using MySql.Data.MySqlClient; 2.创建MySqlConnection对象(链接库) ...
- Windows安全加固(一)
目录: 1.在win ser2016中如何管理重命名administrator,禁用GUEST 2.禁用GUEST账户 3.系统不显示上次登录的账户名. 4.清理系统无效账户. 5.按用户类型分配账号 ...
- 《CUDA编程:基础与实践》读书笔记(5):统一内存编程
统一内存(unified memory)是一种逻辑上的概念,它既不是显存.也不是主机内存,而是CPU和GPU都可以访问并能保证一致性的虚拟存储器.使用统一内存对硬件有较高的要求: 对于所有功能,GPU ...