一、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)
需要注意下面几个问题:
将编译成功后得到的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