基于OCCI访问Oracle的记录

来源:互联网 发布:宽带网络价格 编辑:程序博客网 时间:2024/05/02 22:00

 

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