QT 5.13.1 OCI 访问oracle 12 C数据库

一、oracle  12C 数据库 配置

oracle 12C 可配置多个数据库,应用被隔离到不同的插拔数据库中,监听和TNS 配置的方式也较 oracle 11G有较大不同,首先来看监听的配置:

1、配置监听:

监听示例文件如下:

SID_LIST_LISTENER =
  (SID_LIST =
 (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = E:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1 )
      (SID_NAME = orcl)
    )
 (SID_DESC =
      (GLOBAL_DBNAME = orclpdb)
      (ORACLE_HOME = E:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1 )
      (SID_NAME = orcl)
    )
)

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
  )

ADR_BASE_LISTENER = E:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1\log

需要在监听文件中增加插拔数据库的相关信息,其中SID_LIST表示了数据库实例中的多个插拔数据库相关配置,其中GLOBAL_DBNAME 表示插拔数据库的名称,SID_NAME 表示数据库服务名称,可采用数据库管理员身份(sysdba)登录sqlplus ,通过命令:show parameter service_name来查看数据库服务名称;

完成listener.ora配置文件的修改后再命令行下,使用lsnrctl 命令进入到监听管理中,再继续使用status、stop、start 命令查看监听状态、关闭和重启监听;

2、TNSnames.ora配置

示例如下:

LISTENER =
(ADDRESS= (PROTOCOL, HOST localhost, PORT))

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

ORCLPDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orclpdb)
    )
  )

tnsnames.ora中的service_name即为客户端需要访问服务端的插拔数据库名称

3、配置测试

在sqlplus 中执行以下命令:

sqlplus sys/oracle  as sysdba
//=========切换到插拔数据库======
alter session set container=orclpdb 
//=====启动插拔数据库====
startup
//====创建用户============
create user scott identified by tiger
//====授权用户==============
grant connect,resource,dba to scott

在命令行下进行连接测试,执行命令:

sqlplus scott/[email protected]:1521/orclpdb

如果能够顺利登陆sqlplus说明到插拔数据库的监听配置已经成功

二、QT OCI 的编译

QT应为版权原因,需要在网上下载qt  oci源代码进行编译,获得qsqloci.dll库,在qt creator中打开oci的源代码,修改QOCI工程文件内容,如下示例:

//======编译输出后的库名称========
TARGET = qsqloci

HEADERS += $$PWD/qsql_oci_p.h
SOURCES += $$PWD/qsql_oci.cpp $$PWD/main.cpp

//======必须注释掉================
#QMAKE_USE += oci

#darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
//=======oracle oci.dll 库 配置到 qmake路径=========
//=========注意:32位qt 需要使用32位oracle oci.dll=====
QMAKE_LFLAGS +=E:/app/xdwd-xerlly/product/11.2.0/client_1/BIN/oci.dll
#QMAKE_LFLAGS +=E:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1\bin\ociw32.dll

OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin

#win32:LIBS += -LE:/app/xdwd-xerlly/product/11.2.0/client_1/oci/lib/msvc
#win32:LIBS += -LE:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1\oci\lib\msvc
//==============oralce lib 路径添加到 qt 的lib  路径中=================
LIBPATH += E:/app/xdwd-xerlly/product/11.2.0/client_1/oci/lib/msvc
#LIBPATH += E:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1\oci\lib\msvc
//===============oralce 的头文件路径添加到 qt 的include  路径中=================
INCLUDEPATH +=E:/app/xdwd-xerlly/product/11.2.0/client_1/oci/include
#INCLUDEPATH +=E:\app\xdwd-xerlly\virtual\product\12.2.0\dbhome_1\oci\include
#DEPENDPATH +=E:/app/xdwd-xerlly/product/11.2.0/client_1/oci/include
//=====目标输出路径无效好像对qoci的库不起作用,编译后输出在 源代码所在盘根目录下的E:\plugins\sqldrivers 中
#DESTDIR  = ../oci/lib/


darwin:QMAKE_LFLAGS += -Wl,-flat_namespace,-U,_environ
OTHER_FILES += oci.json
PLUGIN_CLASS_NAME = QOCIDriverPlugin

include(../qsqldriverbase.pri)

需要注意下面几个问题:

  1. 需要把 sqldrivers  路径下configure.pri 文件复制到 qOCI源代码所在的根目录;
  2. 编译的时候会提示一个函数错,应该是qoci中的函数定义和OCI.dll中定义不匹配,当时没有记录那个函数,可使用函数名在网上搜索解决该问题

将编译成功后得到的qsqloci.dll等文件输出到相应编译器以及 qt creator 相应编译器的 plugins\sqldrivers目录下,即可编程访问oci了;需要提醒的是,需要将:oracle oci所在的目录添加到系统的path中,保证qt能够直接访问相应的dll库;

二、QT 使用OCI 

void QTOracbaseleHelper::doOracleConnection(){


    QStringList drivers=QSqlDatabase::drivers();

    for(int i = 0; i< drivers.size();++i)
    {
        QString tmp = drivers.at(i);
        qDebug(qPrintable(tmp));

    }

    QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
    //db.setPort(1521);
   // db.setHostName("127.0.0.1");

    //=======oracle 12c  单实例多数据库,不能采用传统设置主机、端口和sid的方式=====================
    //=========可借鉴jdbc 访问oracle 的方式采用 hostname:port/pdb_database_name的方式访问====
    db.setDatabaseName("127.0.0.1:1521/orclpdb");
    db.setUserName("scott");
    db.setPassword("tiger");

    if(db.open())
    {
        qDebug("database connect success");
    }
    else
    {
        qDebug()<<"";
        qDebug()<

需要注意:因为oracle  12c 使用多个插拔数据库,不能采用传统的设置端口、主机名称、数据库名称的方式连接oracle,直接通过设置数据库名称为:hostname:port/pdb_name的方式访问,即:主机地址:端口/pdb数据库名称方式访问oracle

你可能感兴趣的:(其它)