Qt连接oracle数据库生成QOCI驱动

一 资源下载和安装

  • Qt 5.9.3(qt-opensource-windows-x86-5.9.3.exe)
    下载地址:http://download.qt.io/archive/qt/5.9/5.9.3/

   注意:在安装Qt的过程中切记把 src选项勾上,默认是不选的。
             
若Qt安装路径(D:\QT\QT5.9.3\5.9.3)没有src,参考以下博文:
             Qt组件的添加(https://blog.csdn.net/u011607490/article/details/81459072)

  • Oracle11g (win32_11gR2_database_1of2,win32_11gR2_database_2of2)
    下载地址:https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#11g

二 编译生成oracle驱动

1、生成32位oracle驱动

(1)使用Qt打开安装目录下的项目oci.pro,(D:\QT\QT5.9.3\5.9.3\Src\qtbase\src\plugins\sqldrivers\oci)每个人安装路径可能不一样,根据自己的情况更改。
Qt连接oracle数据库生成QOCI驱动_第1张图片

(2)直接编译项目oci,会出现以下错误
Qt连接oracle数据库生成QOCI驱动_第2张图片

解决办法:
 
①将 QMAKE_USE += oci 替换成 QMAKE_LFLAGS +=D:\Oracle\product\11.2.0\dbhome_1\BIN\oci.dll
 ②在末尾添加INCLUDEPATH += D:\Oracle\product\11.2.0\dbhome_1\OCI\include
                            LIBPATH += D:\Oracle\product\11.2.0\dbhome_1\OCI\lib\MSVC
 ③D:\Oracle\product\11.2.0\dbhome_1\是Oracle数据库的安装目录

Qt连接oracle数据库生成QOCI驱动_第3张图片

(3)然后点击状态栏上的 构建(B)->重新构建项目“oci”,没有报错,警告忽略。

(4)在根目录D:\plugins\sqldrivers找到以下四个文件。注:也可能在C盘的根目录下。
Qt连接oracle数据库生成QOCI驱动_第4张图片

(5)将qsqlocid.dllqsqloc.dll复制到Qt的安装目录(D:\QT\QT5.9.3\5.9.3\mingw53_32\plugins\sqldrivers)

(6)至此,准备工作完成。

2、生成64位oracle驱动

介绍:因项目需要,得把该项目放到VS下运行,故重新安装64位Oracle11g和加载64位的Qt编译器。因为我使用的VS版本是VS2017,所以我在Qt上加载了msvc2017_64编译器,在VS上的Qt VS Tools加载了版本msvc2017_64。

(1)请参考以下博文
      https://www.cnblogs.com/tianmochou/p/6708957.html
(2)设置Qt编译器

    路径:工具->选项->构建和运行->构建套件。选择编译器,如下图

Qt连接oracle数据库生成QOCI驱动_第5张图片

(3)选择编译器,点击Debug,将编译器换成64位编译器,修改oci.pro文件,如下图

Qt连接oracle数据库生成QOCI驱动_第6张图片

(4)然后点击状态栏上的 构建(B)->重新构建项目“oci”,没有报错,警告忽略。若报错,试试删除oci.pro项目文件夹中之前生成的东西。

(5)将qsqlocid.dllqsqloc.dll复制到Qt的安装目录(D:\QT\QT5.9.3\5.9.3\msvc2017_64\plugins\sqldrivers)

(6)由于该项目在Qt下已不能运行,将该项目用VS打开,数据库可以成功运行。

三 配置Oracle 11g

1.创建实例

2.配置监听

注意:必须进行这两步才能正常连接数据库。

参考地址:http://blog.itpub.net/31535677/viewspace-2153880/

不需要配置。

四 Qt编写代码连接oracle数据库

1.在项目中的pro文件加上 QT += sql

2.代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include 
#include
#include

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
        db.setHostName("localhost");             //数据库服务器ip
        db.setPort(1521);                        //数据库端口号
        db.setDatabaseName("orcl");              //数据库名称
        db.setUserName("scott");                  //数据库用户名
        db.setPassword("1234");                //数据库密码

        /*若输出列表中出现QOCI8和QOCI,则表示驱动加载成功*/
        QStringList drivers = QSqlDatabase::drivers();
        foreach(QString driver, drivers)
        qDebug() <<"\t" << driver;

        if(!db.open())
        {
            qDebug()<<"open failed";
            qDebug()<

五 疑难

1.问题:SQL Plus出现ORA-12560: TNS: 协议适配器错误问题

   解决:检查注册表。win+R ,输入regedit。找到HKEY_LOCAL_MACHINE->SOFTWARE->Oracle(64位系统安装64位数据库)或者HKEY_LOCAL_MACHINE->SOFTWARE->WOW6432Node->Oracle(64位系统安装32位数据库),找到KEY_OraDb11g_home1,找到ORACLE_SID,查看下它的数值数据,将它改为创建实例中的全局数据库名,我的是orcl。

  参考:https://blog.csdn.net/sixandsix/article/details/69396784

2.问题:程序编译出现错误QSqlError("12505", "Unable to logon", "ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID\n")

   解决:①db.setDatabaseName("orcl"); 查看这个数据库名称是否和创建的一致
              ②任务管理器中服务:[OracleService[SID]]SID是你安装oracle时候的实例名,如果你没有改默认的是[orcl],所以找到[OracleServiceORCL]这个服务,启动它就ok了。

 

你可能感兴趣的:(QT)