简述

最近一段时间在Qt中使用Oracle数据库积累了一些踩坑过程,以及qt使用Oracle数据库的一些操作。

目录

  • 简述
  • 1. Oracle数据库安装
  • 2. Oracle数据库安装注意事项
  • 3. Qt配置Oracle数据库
  • 4. Qt操作Oracle数据库
  • 5.关于Qt使用Oracle报错
  • 6.查询工具介绍

1. Oracle数据库安装

  1. Oracle数据库安装教程点击跳转。

2. Oracle数据库安装注意事项

  1. 数据库安装的跳转连接安装教程采用的是Oracle11g数据库,如果是服务器级别的建议采用更高版本的Oracle比如19c。
  2. 安装过程中的全局数据库名会作为Qt连接Oracle的配置项,需谨记,(无需关心大小写问题)。

3. Qt配置Oracle数据库

  1. Qt配置Oracle数据库点击跳转。此教程使用Qt编译器,编译qt的oci源码,生成dll库。
  2. 我个人使用的是vs2015编译的oci源码,数据库为19c版本,pro为以下格式,仔细检查每个路径文件是否存在
TARGET = qsqlociHEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp#根据Oracle客户端安装路径 指定oci.dll
QMAKE_LFLAGS +=D:/WINDOWS.X64_193000_db_home/oci/lib/msvc/oci.lib#根据Oracle客户端D安装路径 指定头文件目录
INCLUDEPATH += D:/WINDOWS.X64_193000_db_home/oci/include#根据安装的Oracle客户端指定libPath
LIBPATH += D:/WINDOWS.X64_193000_db_home/oci/lib/MSVCdarwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environOTHER_FILES += oci.jsonPLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
  1. 个人生成dll目录为C:\Qt\Qt5.9.3\5.9.3\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers
    qsqloci.dll和qsqlocid.dll
  2. 将dll库拷贝到编译目录下即可。

4. Qt操作Oracle数据库

  1. Qt连接Oracle数据库
 QSqlDatabase db = QSqlDatabase::addDatabase("QOCI", connectName);db.setHostName("localhost");db.setDatabaseName("ORCL");//安装时全局数据库名db.setUserName("system");db.setPassword("xiaoxin521");db.setPort(1521);
  1. Qt查找Oracle表是否存在
1.QSqlDatabase的tables可以返回所有表,然后使用contains可以判断是否存在,这里强烈不建议使用此方式,很耗时,Oracle自带表很多。
2.通过一下sql语句可查询Oracle表,**注意:如果Oracle当前使用的库名中表非常多,此方式也会比较耗时,亲测!,可考虑第三种方式**bool ret = false;QString qSqlString =  QString("select count(*) from user_tables where upper(table_name) = upper('%1')").arg(talbename);QSqlQuery query(qSqlString, database);ret  = query.exec();if (ret) {while (query.next()) {ret = query.value(0).toBool();}}return ret;
3.第三种方式是采用表中表名,创建一个存储表名的表,用来判断该表是否存在,此方式时间优化很高,代码量需增加。
  1. Qt创建Oracle表,创建自增列,不支持double类型,需要用其他类型代替。我个人使用的float足够了,不够需要用Oracle的number类型具体没用过。
    ①.创建表正常操作即可,这里主要是想介绍一下创建自增列。
    ②.首先创建表,id主键,创建成功后需要创建表序列看一下代码,序列sql语句参数可根据Oracle需求修改。
 QString qSqlString = "create table "+talbename+" (""id int PRIMARY KEY,""time timestamp)";QSqlQuery query(qSqlString, database);bool ret = query.exec();if(!ret){//}else {QString sequence = "create sequence " + talbename +"_seq ""increment by 1 ""start with 1 ""maxvalue 1000000 ""minvalue 1 ""nocache ""nocycle";QSqlQuery querySequence(sequence, database);ret = querySequence.exec();if(!ret){//}}return ret;
  1. 使用自增列
    ①当插入数据的时候,values第一个值为id,插入方式如下图。
QString qSqlString="insert into "+talbename+ QString(" values(%1,?)").arg(talbename + "_seq.nextval");
  1. Qt使用Oracle存储时间类型
    ①创建表中存在time字段方便与根据时间来查询数据,在Oracle中使用timestamp类型,如③中实例,插入数据直接addBindValue一个QDateTime类型即可。
    ②根据时间查询数据,下面只贴sql语句,time为字段,%1为表名%2为需要查询的开始时间%3位结束时间,该sql语句是Oracle的标准语句,改为Qt方式使用。
     QDateTime stopTime= tempData.time.addDays(1);QString qSqlString = QString("select * from %1 WHERE time between to_date('%2','yyyy/MM/dd') and to_date('%3','yyyy/MM/dd')").arg(tableName).arg(tempData.time.toString("yyyy-MM-dd")).arg(stopTime.toString("yyyy-MM-dd"));
  1. Qt批量插入数据到Oracle
    下面贴一个批量插入数据的实例,这里要说明一下,当创建表使用的float类型时候批量插入数据时不支持float类型,需要转为double否则会报错ORA-00932。
 QString qSqlString = "create table test (id float)";QVariantList varList;for (double i = 0.1001 ; i < 100000000.0; i+=100.1001) {varList<< 1.12;}String qSqlString= "insert into test(id) values(:id)";QSqlQuery query(getSqlConnect("xiaoxin"));query.prepare(qSqlString);query.bindValue(":id", varList);qDebug() <<  query.execBatch() << varList.size();
  1. 获取Oracle最后一条数据
    如果使用,自增列,那么使用以下方式获取最后的数据然后再进行批量插入。
 QString qSqlString = "SELECT * FROM (SELECT * FROM test ORDER BY id DESC) WHERE ROWNUM = 1";QSqlQuery query(getSqlConnect("xiaoxin"));query.prepare(qSqlString);qDebug() << query.exec() ;qDebug() << query.next() ;qDebug() << query.value("id").toInt();
  1. 关于对Oracle数据库插入大量数据
    ①如果对Oracle插入大数据量时发现很慢可看以下建议
    ②无需频繁获取Oracle进程,使用几个即可。
    ③数据非常建议打包后(批量处理),使用一个QSqlDatabase对象来批量数据数据。

5.关于Qt使用Oracle报错

  1. Oracle表名不能超过30个字符。
  2. ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法,此问题如果没有修改过Oracle的配置文件,解决方法需要->重启软件->重启Qt->重启电脑即可解决问题。
  3. ORA-12518:监听程序无法分发客户机连接,可能是代码中获取Oracle进程过多,百度修改进程数量或者修改代码。
  4. ORA-12560: TNS: 协议适配器错误的解决方法,此问题最为头疼的一个问题,记得看过官方解释说该问题未得到解决,解决方法为如果是低版本此问题百度无法解决,那么升级为19c基本上是可以解决的,或者重装系统以及重装数据库。
  5. ORA-01652:无法通过1024(在表空间SYSTEM中):该问题是oracle的表空间DBF存储文件达到了限制,查看该博客增加基础知识点击,Oracle的DB_BLOCK_SIZE大小根据操作系统来决定,我个人使用Oracle19安装后是8k,正常情况下只支持32G数据,解决方案如下。
1.创建bigfile ORCL为表空间名 datafile为存储的文件路径 size为初始大小
create bigfile tablespace ORCL datafile 'D:\app\oradata\SYSTEM\ORCL01.DBF'  size 500M  autoextend on;
2.创建一个用户ORCL,结尾ORCL是表空间名
create user ORCL identified by Admin123 default tablespace ORCL;
3.给用户授权
grant connect , resource,dba to ORCL;
4.查询该用户的表空间使用名称
SELECT default_tablespace from dba_users where username = 'ORCL';
5.如果不是ORCL改一下,然后commit提交一下。
alter user ORCL  default tablespace ORCL;

操作以上步骤后,需要使用该用户即可。

6.查询工具介绍

  1. 使用PLSQL Developer 13查询Oracle数据特别方便
  2. 链接如下,包含中文教程,破解。
  3. 跳转提取码:oucb 。

完结!

Qt使用Oracle数据库踩坑教程相关推荐

  1. wps vb mysql_VB连接ORACLE数据库踩坑录

    背景 vb程序由于编译出来的都是32位应用程序,在之前win7 32位操作系统下使用office软件,正常: 起因 系统升级为win10 64位操作系统,office软件不再使用微软,使用金山wps软 ...

  2. 首次使用windows10安装DB2_10.5数据库踩坑全教程,附加问题解决目录思路汇总

    新入职的IBM,需要安装IBM的数据库DB2,搞了两天踩坑全教程,下面是踩坑说明. DB2是IBM的数据库,官网说明是这个网址: IBM DocsIBM Documentation.https://w ...

  3. 将Hexo个人博客部署到个人云服务器--最详细踩坑教程

    将Hexo个人博客部署到个人云服务器–最详细踩坑教程 文章目录 将Hexo个人博客部署到个人云服务器--最详细踩坑教程 一. 背景 *二. 获取体验产品--服务器(选读节) (一)说明 (二)购买体验 ...

  4. Windows 2016 server NVIDIA cuda toolkit11.3 pytorch-gpu 踩坑教程

    Windows 2016 server NVIDIA k20c cuda toolkit11.3 pytorch-gpu 踩坑教程 巨坑 兄弟们 各种bug,按照文档一步一步来. 1. 环境 操作系统 ...

  5. oracle数据库的基本教程 pdf,Oracle数据库技术基础教程 PDF 下载

    相关截图: 资料简介: 本书主要介绍Oracle数据库的基本概念.知识和技术,注重培养Oracle数据库技术的基本操作技能.本书内容体系完整,覆盖了Oracle数据库技术的主要组成部分,设置有Orac ...

  6. Realm数据库踩坑

    今天升级Realm数据库实体类的时候,发现数据库东西不见了,折腾了一下午,得到一些教训,这里转一些知识点,下次升级时候用. /*** Realm数据库升级*/ public class MyMigra ...

  7. Oracle数据库踩的坑

    1.explain报ok,但是真正执行报错 Oracle的to_char函数的功能是将数值型或者日期型转化为字符型,在遇到字符类型时会报错: 但是, explain会报成功,不太理解- 2.中文的正则 ...

  8. CentOs服务器下安装两个个MySql数据库踩坑日记

    本篇博客如题:在服务器上安装两个MySql. 背景: 其实并非本意非要安装两个服务器,奈何不知道前面项目的数据库密码,并且数据库版本是8.x,另外还有项目在上面运行,前面的人把数据库装到了系统盘,留下 ...

  9. centos 安装2个mysql_CentOs服务器下安装两个个MySql数据库踩坑日记

    背景: 其实并非本意非要安装两个服务器,奈何不知道前面项目的数据库密码,并且数据库版本是8.x,另外还有项目在上面运行,前面的人把数据库装到了系统盘,留下了500G的数据盘没用,所以本着折腾的精神,就 ...

最新文章

  1. Vue 过渡组件,可实现组件或者页面的动画过渡或者css过渡
  2. 首页列表显示全部问答,完成问答详情页布局。
  3. 今天改bug遇到一个ie8样式错乱问题
  4. 基础练习 数列排序 c语言
  5. 会计专业领域计算机应用系统,信息技术在会计专业领域中的应用
  6. php 年月日 中文,php Date()函数输出中文年月日时分秒_PHP教程
  7. 在div中使用css让文字底部对齐的方法
  8. c#进销存(1):需求分析
  9. Extjs项目实战视频教程
  10. java基础篇(二) ----- java面向对象的三大特性之继承
  11. (Win7重装)向官方Win7镜像注入驱动程序
  12. php值班系统,php简单的值日值班处理方法
  13. dirt安装,记录两个印象深刻的问题
  14. 耐得住寂寞方能不寂寞
  15. 手把手教程 | 使用 NICE DCV 在 G4 实例上运行 Android 应用程序
  16. java什么是reference_如何理解java中的Reference和引用类型?正确的案例讲解
  17. MFC通讯录入门必看
  18. 欧拉角的概念理解和欧拉角旋转矩阵推导
  19. 论文成功写作技巧之行之有效的写作从“结果”开始(上)
  20. 不同网段无法访问共享文件夹的解决办法

热门文章

  1. JavaScript中return的用法详解
  2. 简单的MIPS指令编译程序
  3. 【优化模型】最短路问题 之 固定起点的最短路
  4. 数据库隔离级别及可能引发的问题
  5. 升级ingress-nginx-controller的nginx版本
  6. 如何在MFC中插入背景图片
  7. 【Java扫盲篇】今天用人话给你讲清楚:进程、线程、并发、并行、高并发?
  8. 如何理解:程序、进程、线程、并发、并行、高并发?
  9. mysql安装了如何启动_Mysql安装、启动与使用
  10. 警惕求职面试中的语言陷阱