Qt5.12 + VS2015编译oci驱动

时间:2024-10-05 17:51:42

QT编译oci驱动

  • 环境
  • 步骤
    • 下载Oracle动态库和静态库
    • oci工程编译
      • 1)更改oci工程
      • 2)使用VS2015编译
    • 使用oci驱动连接Oracle

最近做项目需要连接Oracle数据库,查询资料发现需要oci驱动.之前都是再Linux下使用ODBC,现在改为Windows,不熟悉啊.折腾了两天终于可以了.记录一下省的忘了.
非常感谢广大博主的分享,尤其感谢博主 obervose ,在博主obervose基础上添加一些自己解决问题.

环境

win7 64位系统
QT版本是5.12.7,安装时选择了msvc201564位
Visual Studio 2015

步骤

下载Oracle动态库和静态库

地址:/technetwork/topics/
下载instantclient-sdk-windows.x64-12.2.0.1.(.lib和头文件)、instantclient-basic-windows.x64-12.2.0.1.(.dll文件).
因为我使用的oracle服务端安装64位系统,并且vs2015也是64位的,所以没有按照博主 obervose 说的下载32位依赖包.

oci工程编译

1)更改oci工程

遇到问题1:"Project ERROR:Library ‘oci’ is not defined "
1)使用Qt打开oci工程: xxx/Qt5.12.7/5.12.7/Src/qtbase/src/plugins/sqldrivers/oci/
2)这里我们需要更改一下pro工程文件内容:
将QMAKE_USE +=oci注释掉,在前面加一个#
添加一行 QMAKE_LFLAGS +=
遇到问题2:“Cannot read C:/”
没有找到文件,发现xxx/Qt5.12.7/5.12.7/Src/qtbase/src/plugins/sqldrivers有.
1)打开文件,注释掉"include(shadowed(

PWD)/)"
2)添加include(xxx/Qt5.12.7/5.12.7/Src/qtbase/src/plugins/sqldrivers/)
注意:更改完成要保存.

2)使用VS2015编译

按照博主 obervose 进行编译oci驱动.
1)更改属性
右键oci,点击属性.
第一步:更改输出目录
在配置属性==>常规==>输出目录,为$(QTDIR)\plugin\sqldrivers
在这里插入图片描述
第二步:添加引用头文件
C/C++=>常规=>附加包含目录,添加下载oracle的sdk中头文件.
【(全路径)instantclient12.2.0.1.0\x64\instantclient_12_2\sdk\include】
在这里插入图片描述

第三步:添加依赖所在文件
在链接器=>常规=>附加目录库,添加【(全路径)\instanclient-sdk-windows.x64-12.2.0.1.0\instantclient_12_2\sdk\lib\msvc
在这里插入图片描述
第三步:添加库
在链接器=>输入=>附加依赖项,添加
在这里插入图片描述
第四步:编译
虽然更改生成目录,但是没有生效.
编译好的文件在C:\plugins\sqldrivers

使用oci驱动连接Oracle

第一步:VS2015创建Qt工程,必须勾选SQL组件
如果是已生成Qt工程,需要在工程的工具栏,选择Qt VS Tools
=>Qt Project Settings=>Qt Modules 勾选SQL

在这里插入图片描述

在这里插入图片描述
第二步:将生成的 和放到可执行文件的同级目录下(我编译的是debug版本).

第三步:根据博主 obervose 说的,程序在运行时需要将、、,拷贝到可执行文件的根目录同级目录,程序运行时需要加载这些文件。

第四步:测试

#include <QtCore/QCoreApplication>
#include <>
#include <>
#include <>

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
	db.setHostName("192.168.85.155");
	db.setDatabaseName("test");
	db.setUserName("scott");
	db.setPassword("123456");
	db.setPort(1521);
	bool ret = db.open();
	if (!ret)
	{
		qDebug() << QString::fromLocal8Bit("Oracel 数据库未连接") << endl;
		qDebug() << db.lastError().text() << endl;
		return false;
	}
	qDebug() << QString::fromLocal8Bit("Oracle数据库连接成功") << endl;

	return a.exec();
}
  • 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

如果有什么不对的地方,请大家留言指教!