前言

  最近工作中,有家医院的HIS使用的是oracle数据库(oracle11g),最终方案采用qt5.6.2桌面应用程序远程连接内网oracle的方式。

一、准备工作

  1. qt5.6.2-msvc32下载安装
    版本为qt-opensource-windows-x86-msvc2015-5.6.2.exe,安装时必须带有源码。
  2. oracle对oci驱动支持的文件下载
    我这里选择是32位的,版本为Version 11.2.0.4.0
    下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
  3. VS2015和Qt插件下载安装
    Qt插件下载地址:

链接:https://pan.baidu.com/s/1YXzpV6Dwiqb1vAWuI_QJKQ

提取码:4nx8

双击安装,安装完成后运行VS2015,如下:

选择Qt Options,配置Qt版本,如下:

二、编译32位驱动

待编译工程在:C:\Qt\Qt5.6.2\5.6\Src\qtbase\src\plugins\sqldrivers\oci目录下,使用VS中Qt插件打开oci.pro文件,如下:

编译,发现提示头文件#include 找不到,这就需要配置前面下载的oracle驱动支持文件了。

1、添加头文件

选择工程,鼠标右键-属性,如下:

进入附加包含目录,选择sdk/include文件夹,如下:

2、添加lib库的附加库目录

操作如下:

进入附加库目录,选择sdk/lib/msvc文件夹,如下:

3、配置lib文件

操作如下:

进入附加依赖项,可以看到oci.lib已存在,如下:

4、编译

编译,编译成功输出如下:

在目录C:\Qt\Qt5.6.2\5.6\Src\qtbase\plugins\sqldrivers下,可以找到编译好的驱动文件,如下:

三、Qt操作数据库

将编译好的dll文件拷贝到目录C:\Qt\Qt5.6.2\5.6\msvc2015\plugins\sqldrivers下。
如下是连接数据库的代码:

bool Tmdatabase::connectDB()
{
    //
    database = QSqlDatabase::addDatabase("QOCI");
    database.setDatabaseName(QString("%1:%2/%3").arg(m_dbhost).arg(m_dbport).arg(m_dbname));
//    database.setHostName(m_dbhost);  //数据库主机名
//    database.setPort(m_dbport);
//    database.setDatabaseName(m_dbname);   //数据库名 
    database.setUserName(m_dbuser);      //数据库用户名
    database.setPassword(m_dbpass);      //数据库密码 
    //
    if (!database.open())
    {
        qDebug() << "oracle open fail error =" <<database.lastError().text();
        return false;
    }
    return true;
}

注意:针对oracle数据库,通过调用setDatabaseName函数以主机名:端口/服务名的形式连接,而不是单独设置。

四、远程访问

  我是写了一个简单的http服务程序,操作数据库的代码都在这个程序里面,http服务程序和Qt桌面应用程序部署在同一机器上,我们称为机器A。数据库在内网中的另一台机器上,我们称为机器B。
  在远程访问前,对机器A进行设置,因为A机器是双网卡,,所以为机器A设置了固定IP,最后ping机器B的IP地址,发现超时。此时,需要我们设置静态路由,在机器A上,以管理员用户进入命令行,输入如下命令:

route add 192.168.160.0 mask 255.255.255.0 192.168.140.254

其中,192.168.160.0为机器B(该机器IP为192.168.160.218)所在的网络,192.168.140.254为机器人A(该机器IP为192.168.140.112)所在网络的网关。
  再ping时,发现能成功ping通。在后面的使用过程中,发现机器A重启后,设置的静态路由失效,而我们需要永久有效,所以将设置命令修改如下:

route add -p 192.168.160.0 mask 255.255.255.0 192.168.140.254

要想远程访问oracle数据库,不需要在本地安装oracle数据库服务端,可以只安装一个oracle客户端。
下载地址如下:
链接:https://pan.baidu.com/s/1gO7ahVwpJ38fV9HUWbN1pw
提取码:anmp
  安装完成后,进行系统变量设置,如下:
(1)添加系统变量NLS_LANG
(2)添加系统变量ORACLE_HOME
(3)添加系统变量TNS_ADMIN

添加环境变量,如下:

设置完成后,找到tnsnames.ora文件,根据自己的情况修改,如下:

部署http服务程序,双击运行后,发现远程连接数据库成功。