前言:本人最近在温习PowerBuilder,当访问Oracle数据库时遇到了两个问题,本质是32位和64位程序错位问题。本文提供这两个32位IDE访问Oracle 11g/10g 64位数据库连接错误的解决办法。为了备忘以及帮助别人,特此记录解决问题的过程。
1.版本采用原则
在给出解决办法之前,应说明开发工具和开发包版本采用原则。我的原则是:使用最新稳定版本的前一个稳定版本。理由是,每当新稳定版本,我一般会迁移到前一个稳定版本,这样能解决很多已知bug,也能提前做好移植工作,以免发布版本和实施版本时由于版本兼容问题而措手不及。
但是,现实有时候很残酷,由于成本、时间等原因,老版本可能一直使用下去。这时候更换开发环境、测试环境、线上运行环境,就会遇到大量兼容问题、开发工具已知bug波及问题、开发包已知bug波及问题等。本文将要解决的问题就是类似问题。
2.问题现象
2.1开发环境
所要维护的老系统用PB开发,我要重新构建开发环境:
- 操作系统:64位Windows 10
- 开发IDE:32位PowerBuilder 12.6(以下简称PB)
- 数据库:64位Oracle 11g
PB是32位的,所以不管是采用ODBC访问Oracle,还是采用OCI(英文全称为Oracle Call Interface)连接Oracle均出现问题。我相信,不采用PB而使用其他32位开发工具也会出现相同问题,因此以上开发环境中用其他32位开发工具,例如visual basic早期版本,也能参考本文的办法解决问题。
2.2 ODBC错误
2.2.1错误现象
如下图,PB报错提示Error while trying to retrieve text for error ORA-01019,在PB的Database中双击数据源或者执行弹出菜单connect,随后报此错。
2.2.2检查设置
ODBC设置本身应该没有问题。检查64位ODBC设置如下:
实际上用不上64位ODBC设置,因为PB是32位的。64位ODBC设置程序为:“ODBC数据源(64位)”,可以直接在操作系统中搜索ODBC找到它。
检查32位ODBC设置如下:
32位ODBC设置程序为:“ODBC data sources(32-bit)”,可以直接在操作系统中搜索ODBC找到它。
2.2.3问题分析
不管是32位ODBC还是64位ODBC都有问题,这是因为Oracle是64位的,提供的ODBC驱动也是64位的。
2.3 OCI错误
2.3.1错误现象
如下图,PB报错提示Oracle library OCI.dll could not be loaded,在PB的Database中双击数据源或者执行弹出菜单connect,随后报此错。
2.3.2问题分析
PB找到的OCI驱动是64位的,因为PB自动按照oracle的安装设置来寻找oci.dll等文件。
3.解决过程
3.1下载32位驱动
需要找到oracle提供的官方驱动,链接为:
https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html
如下图,点basic和odbc两个链接分别下载OCI和ODBC驱动。
获得的文件分别为:instantclient-basic-nt.zip和instantclient-odbc-nt.zip,因为本文编写之时,驱动的最新版本为21.7.0.0.0,所以这两个文件的版本号为:21.7.0.0.0
3.2 OCI驱动安装
分四步:
3.2.1解压
解压instantclient-basic-nt.zip到oracle安装目录的product目录下,一般oracle默认安装在:<oracle基目录>+<product目录>+<home目录>,例如:d:\oracle\product\11.2.0\dbhome_1。而我的安装目录在D:\oracle\home。
3.2.2重新放置文件夹
解压后的目录为instantclient_21_7,放到product目录后,如下图:
强烈建议不放到home目录中,因为home下有一个instantclient目录,很可能混淆,如下图:
3.2.3设置环境变量
设置环境变量Path以便于PB能访问到instantclient_21_7,如下图:
3.2.4 测试
到PB中连接数据源(双击或者右键菜单connect),还是出错,不过错误为:Error while trying to retrieve text for error ORA-01804,如下图:
这个问题只要调整path中home路径和instantclient路径顺序即可,如下图:
重新测试,连接成功,如下图:
附上PB的oci连接设置:
3.3 ODBC驱动安装
3.3.1解压和放置文件夹
解压instantclient-odbc-nt.zip到刚才的instantclient_21_7目录下。
3.3.2 执行安装文件
执行odbc_install.exe文件,如下图:
双击后,屏幕一闪而过,表示安装成功。
3.3.3 设置环境变量
设置环境变量TNS_ADMIN为D:\oracle\home\NETWORK\ADMIN,这个目录是tnsnames.ora所在目录,如下图:
3.3.4 测试
测试方法是打开windows10操作系统的“ODBC data sources(32-bit)”程序(其他版本的win操作系统可能不一样),删除以前建的oracle数据源,点“添加”,显示“创建新数据源”弹窗,会发现最后比以前多了一列:Oracle in instantclient_21_7。这个表示odbc驱动安装成功。
继续设置数据源,TNS Service Name设置为ORACLR_CONNECTION_DATA ,ORACLR_CONNECTION_DATA 是使用Oracle Net Configuration Assistent设置的名称,如下:
新的32位ODBC数据源配置如下:
到PB中修改ODBC连接配置,如下:
但是,到PB中连接时还是出错:
解决办法是修改32位ODBC数据源配置中的“TNS Service Name”,用连接串(我使用的是dbserver:1521/orcl,其中dbserver是oracle数据库服务器名称,1521是端口,orcl是数据库实例名称)替换ORACLR_CONNECTION_DATA,如下图:
点上图中“Test Connection”,提示成功,如下图:
在PB中重新连接ODBC 连接profile(双击或者右键菜单connect),提示成功,如下图:
到此成功解决问题!!!
参考链接:
(1)win7 64位系统 PB连接oracle数据库出现“oracle library oci.dll could not be loaded”问题的解决方法
(2)32位元odbc配置oracle,Oracle的32位ODBC驱动