基于OCCI访问Oracle的记录

 

我在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的函数定位错误。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值