基于OCCI访问Oracle的记录

本文记录了Oracle 9i OCCI应用迁移至10g过程中遇到的问题及其解决办法。详细介绍了不同Oracle版本DLL兼容性问题、环境变量配置、即时客户端版本选择等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在oracle 9i的环境下开发了occi的应用,结果放到10g(10.2.0.3)服务器上运行不了(只装了windows 版的10g服务端),只好把所有依赖的9i的dll拷过去,结果连接occi报错:

Error while trying to retrieve text for error ORA-32101


http://www.oracle.com/technology/global/cn/software/tech/oci/instantclient/index.html下载一个即时客户端10g(10.2.0.3)
安装并设置instantclient(解压缩到C盘,设置path和TMS_ADMIN等环境变量),还是ORA-32101错误(而且导致原来其他基于ODBC访问oracle的应用也会报错了:internal error -

unable to initialize NLS during driver load.)

Google之,说要设置环境变量,添加ORACLE_HOME=c:/oracle/product/10.1.0/em_1,报错改变:ORA-12538: TNS:no such protocol adapter


再Google之,有高人提到:
10g的occi库对应不同的vc有不同的库文件(在http://www.oracle.com/technology/tech/oci/occi/occidownloads.html可下载vc8的库,在instantclient sdk包里有vc7,vc71的

库,oracle服务端安装后也有默认的oci的库),但我下在的10g(10.2.0.3) instantclient里面只有vc7,vc71的库,就是没有vc6的!!

如果直接用oracle 10g(10.2.0.3)服务端自带的occi库(在C:/oracle/product/10.1.0/db_1/OCI/lib/MSVC/),结果运行时

try{
env = Environment::createEnvironment (Environment::DEFAULT);
conn = env->createConnection (user, passwd, db);
}catch(SQLException ex)
{
errS = (ex.getMessage()).c_str();
errCode = ex.getErrorCode();
}


运行到这一句errS = ex.getMessage();会异常!这应该是由于10g occi用的string和vc6 的 string不兼容造成的。

改成errS = ex.getMessage().c_str();后可以看见获得的错误描述:
ORA-24960: 属性 OCI_ATTR_USERNAME 的长度大于最大允许长度 255


后来才发现10.1.0.5版本的10g的instantclient sdk才有支持vc6的库(10.2.0.3以后就没有了),用这个替换10.2.0.3的库,编译完成,再将instantclient里面的oci.dll及vc6

下面的oraocci10.dll放到执行文件的旁边,拷到10g服务器上运行OK(注意这时在9i上运行反而会异常的,应该是调用到9i的dll导致)。

解决方案二:
改用VS2003+10.2.0.3的库进行编译,也可以在10g(10.2.0.3) 服务器的电脑上运行,注意这时不要在10g上面再安装9i的客户端程序,要不然会有oci.dll的函数定位错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值