文章目录
- 0 代码仓库
- 1 环境以及条件说明
- 2 准备一:下载Oracle 19c驱动,需要下载两个包,注意分x86和x64
- 2.1 32位
- 2.2 64位
- 2.3 新建目录并解压缩
- 2.4 记录路径
- 2.4.1 `x86`需要的路径
- 2.4.2 `x64`需要的路径
- 3 准备二:下载Sources源代码的两种方法
- 3.1 方法一:
- 3.3 方法二:
- 3.3 进入到oci.pro目录
- 3.4 备份oci.pro
- 3.5 返回上级目录备份qsqldriverbase.pri
- 4 编译驱动
- 4.1 修改oci.pro注意事项
- 4.2 修改oci.pro,使用MinGW64位进行编译
- 4.3 MinGW64构建套件编译
- 4.3.1 QT界面中修改qsqldriverbase.pri
- 4.3.2 选择编译器并指定构建目录
- 4.3.2注意事项
- 4.3.2
- 4.4 进行Debug编译
- 4.5 代码测试
- 4.4 进行Release编译
0 代码仓库
1 环境以及条件说明
操作系统:windows10专业版
数据库服务器版本:oracle 19c
oracle instant client版本:19.18
QT版本:5.15.2,且安装的时候没有
勾选了源码
QT安装目录:D:\Qt
QT编译套件1:MinGW32/MinGW64(关于32位位与64位问题要与数据库一致)
QT编译套件2:MSVC2019_32/MSVC2019_64(不同的编译套件默认内置的数据库驱动是不一样的,具体看套件的plugins/sqldrivers/目录下的库文件)
2 准备一:下载Oracle 19c驱动,需要下载两个包,注意分x86和x64
2.1 32位
x86下载地址:https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html
① instantclient-basic-nt-19.18.0.0.0dbru.zip
② instantclient-sdk-nt-19.18.0.0.0dbru.zip
2.2 64位
x64下载地址:https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
① instantclient-basic-windows.x64-19.18.0.0.0dbru.zip
② instantclient-sdk-windows.x64-19.18.0.0.0dbru.zip
2.3 新建目录并解压缩
主目录
D:\ProgramData\QT_Oracle19
2.4 记录路径
具体需要哪个,需要根据具体情况使用。
2.4.1 x86
需要的路径
动态库路径
D:\ProgramData\QT_Oracle19\x86\instantclient_19_20
头文件目录
D:\ProgramData\QT_Oracle19\x86\instantclient_19_20\sdk\include
库文件路径
D:\ProgramData\QT_Oracle19\x86\instantclient_19_20\sdk\lib\msvc -loci
2.4.2 x64
需要的路径
动态库路径
D:\ProgramData\QT_Oracle19\x64\instantclient_19_20
头文件目录
D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\include
库文件路径
D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\lib\msvc -loci
3 准备二:下载Sources源代码的两种方法
3.1 方法一:
直接逛网下载,并拷贝到QT安装目录
我的是5.12.2版本,因此到对应的目录去下载
https://download.qt.io/archive/qt/5.15/5.15.2/single/
新建Src目录,拷贝解压缩的文件至本目录
D:\Qt\5.15.2\Src
3.3 方法二:
使用QT Maintenance
3.3 进入到oci.pro目录
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci
3.4 备份oci.pro
3.5 返回上级目录备份qsqldriverbase.pri
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers
4 编译驱动
qtcreator打开oci.pro,并对oci.pro的内容进行修改,如下:
- 原版:
4.1 修改oci.pro注意事项
-
如果编译套件使用的是MinGW
32
位,那么在选择InstantClient的动态库时,就应该指定32位的动态库、头文件和库文件路径。 -
如果编译套件使用的是MinGW
64
位,那么在选择InstantClient的动态库时,就应该指定32位的动态库、头文件和库文件路径。 -
不推荐使用MSVC编译,MinGW的跨平台性好一点。
4.2 修改oci.pro,使用MinGW64位进行编译
TARGET = qsqlociHEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp#注释该行
#QMAKE_USE += oci#根据Oracle客户端或者instantclient安装路径和版本指定oci.dll
QMAKE_LFLAGS += D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\oci.dll#根据Oracle客户端安装路径 指定头文件目录
INCLUDEPATH += D:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\include
#根据Oracle客户端安装路径 指定库文件(.lib)路径
LIBS += -LD:\ProgramData\QT_Oracle19\x64\instantclient_19_20\sdk\lib\msvcdarwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environOTHER_FILES += oci.jsonPLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
4.3 MinGW64构建套件编译
这里可能会出现一个相关的报错,因此需要修改,如果没有则跳过4.3.1:
QT编译Oracle/MySQL等数据库驱动报错:Cannot read qtsqldrivers-config.pri: No such file or directory
4.3.1 QT界面中修改qsqldriverbase.pri
include(./configure.pri)
4.3.2 选择编译器并指定构建目录
4.3.2注意事项
我的QT不能自动设置构建目录,所以没有设置好的时候,一直各种莫名其妙的错误…构建目录不能指定在oci的上级文件夹,也不能自己新建一个别的名字的文件夹
4.3.2
我的构建目录是
D:\Qt\5.15.2\mingw81_64\qtbase\src\plugins\sqldrivers\build-oci-Desktop_Qt_5_15_2_MinGW_64bit-Debug
因此构建完成后要到指定的目录下的
4.4 进行Debug编译
将这三个文件拷贝到
4.5 代码测试
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);qDebug() << QSqlDatabase::drivers();// 添加数据库实例QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");// 设置连接信息db.setHostName("192.168.111.133"); // 主机地址db.setPort(1521); // 如果是默认端口, 可以不设置db.setDatabaseName("ORCLCDB"); // 数据库名db.setUserName("c##beza");db.setPassword("123456");qDebug() << "准备连接...";// 连接数据库if(db.open()){qDebug() << "数据库连接成功";// 数据库查询QSqlQuery q;QString sql = "select * from dept";bool bl = q.exec(sql);if(!bl){qDebug() << "查询失败";}else{// 遍历结果while(q.next()){// 取出当前记录中的字段qDebug() << "ID:" << q.value("ID").toInt()<<"Name: " << q.value("NAME").toString()<<"Location: " << q.value("LOCATION").toString();}}// 插入数据sql = "insert into dept values(3, 'LeAnn', 'Tokyo')";QSqlDatabase db1 = QSqlDatabase::database();db1.transaction();bl = q.exec(sql);if(bl==false){qDebug() << "插入失败";db1.rollback();}else{qDebug() << "插入数据成功";db1.commit();}}else{qDebug() << "数据库连接失败";}}MainWindow::~MainWindow()
{delete ui;
}
执行前
执行后