操作系统: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/目录下的库文件)
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
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
主目录
D:\ProgramData\QT_Oracle19
具体需要哪个,需要根据具体情况使用。
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
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
直接逛网下载,并拷贝到QT安装目录
我的是5.12.2版本,因此到对应的目录去下载
https://download.qt.io/archive/qt/5.15/5.15.2/single/
新建Src目录,拷贝解压缩的文件至本目录
D:\Qt\5.15.2\Src
使用QT Maintenance
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci
D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers
qtcreator打开oci.pro,并对oci.pro的内容进行修改,如下:
如果编译套件使用的是MinGW32
位,那么在选择InstantClient的动态库时,就应该指定32位的动态库、头文件和库文件路径。
如果编译套件使用的是MinGW64
位,那么在选择InstantClient的动态库时,就应该指定32位的动态库、头文件和库文件路径。
不推荐使用MSVC编译,MinGW的跨平台性好一点。
TARGET = qsqloci
HEADERS += $$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\msvc
darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin
include(../qsqldriverbase.pri)
这里可能会出现一个相关的报错,因此需要修改,如果没有则跳过4.3.1:
QT编译Oracle/MySQL等数据库驱动报错:Cannot read qtsqldrivers-config.pri: No such file or directory
include(./configure.pri)
我的QT不能自动设置构建目录,所以没有设置好的时候,一直各种莫名其妙的错误…构建目录不能指定在oci的上级文件夹,也不能自己新建一个别的名字的文件夹
我的构建目录是
D:\Qt\5.15.2\mingw81_64\qtbase\src\plugins\sqldrivers\build-oci-Desktop_Qt_5_15_2_MinGW_64bit-Debug
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
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;
}