QT5.14.1+Win7 64+Oracle11gR2 Qt连接数据库
yuyutoo 2024-10-22 18:40 1 浏览 0 评论
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*类型即可,同时函数名也要改为旧版本。
【领QT开发教程学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
点击→领取「链接」
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>
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;
}
2. qt中的数据库操作
// 需要添加的模块
QT += sql
12
- 创建数据库实例, 并且登录数据库 -> 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();
// 示例程序
// 打印支持的数据库的驱动
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语句的类 -> QSqlQuery
【领QT开发教程学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
点击→领取「链接」
// 常用的构造函数
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;
示例代码
// 打印支持的数据库的驱动
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();
}
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位
*/
相关推荐
- mysql数据库如何快速获得库中无主键的表
-
概述总结一下MySQL数据库查看无主键表的一些sql,一起来看看吧~1、查看表主键信息--查看表主键信息SELECTt.TABLE_NAME,t.CONSTRAINT_TYPE,c.C...
- 一文读懂MySQL的架构设计
-
MySQL是一种流行的开源关系型数据库管理系统,它由四个主要组件构成:协议接入层...
- MySQL中的存储过程和函数
-
原文地址:https://dwz.cn/6Ysx1KXs作者:best.lei存储过程和函数简单的说,存储过程就是一条或者多条SQL语句的集合。可以视为批文件,但是其作用不仅仅局限于批处理。本文主要介...
- 创建数据表:MySQL 中的 CREATE 命令深入探讨
-
数据库是企业日常运营和业务发展的不可缺少的基石。MySQL是一款优秀的关系型数据库管理系统,它支持数据的插入、修改、查询和删除操作。在数据库中,表是一个关系数据库中用于保存数据的容器,它由表定义、表...
- SQL优化——IN和EXISTS谁的效率更高
-
IN和EXISTS被频繁使用在SQL中,虽然作用是一样的,但是在使用效率谁更高这点上众说纷纭。下面我们就通过一组测试来看,在不同场景下,使用哪个效率更高。...
- 在MySQL中创建新的数据库,可以使用命令,也可以通过MySQL工作台
-
摘要:在本教程中,你将学习如何使用MySQLCREATEDATABASE语句在MySQL数据库服务器上创建新数据库。MySQLCREATEDATABASE语句简介...
- SQL查找是否"存在",别再用count了
-
根据某一条件从数据库表中查询『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECTCOUNT(*)呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往...
- 解决Mysql数据库提示innodb表不存在的问题
-
发现mysql的error.log里面有报错:>InnoDB:Error:Table"mysql"."innodb_table_stats"notfo...
- Mysql实战总结&面试20问
-
1、MySQL索引使用注意事项1.1、索引哪些情况会失效查询条件包含or,可能导致索引失效如果字段类型是字符串,where时一定用引号括起来,否则索引失效...
- MySQL创建数据表
-
数据库有了后,就可以在库里面建各种数据表了。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性)约束的过程。后面也是通过SQL语句和Navicat...
- MySQL数据库之死锁与解决方案
-
一、表的死锁产生原因:...
- MySQL创建数据库
-
我的重点还是放在数据表的操作,但第一篇还是先介绍一下数据表的容器数据库的一些操作。主要涉及数据库的创建、修改、删除和查看,下面演示一下用SQL语句创建和用图形工具创建。后面主要使用的工具是Navica...
- MySQL中创建触发器需要执行哪些操作?
-
什么是触发器触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段...
- 《MySQL 入门教程》第 17 篇 MySQL 变量
-
原文地址:https://blog.csdn.net/horses/article/details/107736801原文作者:不剪发的Tony老师来源平台:CSDN变量是一个拥有名字的对象,可以用于...
- 关于如何在MySQL中创建表,看这篇文章就差不多了
-
数据库技术是现代科技领域中至关重要的一部分,而MySQL作为最流行的关系型数据库管理系统之一,在数据存储和管理方面扮演着重要角色。本文将深入探讨MySQL中CREATETABLE语句的应用,以及如何...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)