nclob = rs->getClob(2);
nclob.open(OCCI_LOB_READONLY);                      /*注释这段可以,这是访问一台ORACLE编码使用的是UTF-8*/
//nclob.setCharSetForm(OCCI_SQLCS_IMPLICIT);
//nLobSize=nclob.length();
//nFileSize=3*nLobSize;//因为UTF-8一个字占3位
//nclob.setCharSetId("UTF8");
                      /*这段不可以,这是访问一台ORACLE编码使用的是GBK*/
nclob.setCharSetForm(OCCI_SQLCS_IMPLICIT);
nLobSize=nclob.length();
nFileSize=2*nLobSize;
nclob.setCharSetId("gbk");
bufp=new char[nFileSize];
nReadSize=nclob.read(nLobSize,(unsigned char*)bufp,nFileSize,1);
nclob.close();
if(nReadSize<=0)
{
printf("读取CLOB字段失败");
}
             /*这两个函数据不知道是什么用,有什么区别*/
nclob.setCharSetForm();
nclob.setCharSetId();

解决方案 »

  1.   

    1.OCCI_SQLCS_IMPLICIT表示,应该使用本地数据库的字符集;
    2.setCharSetForm()设置字符集的形式, 参数是“Clob字符集的形式”,本例中表示设置为“本地数据库字符集”
    3.setCharSetId() 设置CLOB字符集ID,都是设置字符集相关的,但是我也不太清楚这个ID到底是个什么东西。大概就类似于NAME是个部门名称 ,ID是这个部门所属的大分类的编号吧。对CLOB的操作,你可以参考一下这里:
    http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28393/adlob_lob_ops.htm#i1038288
    http://download.oracle.com/docs/cd/B12037_01/appdev.101/b10778/reference007.htm#i1130838
      

  2.   

    谢谢  是我的字符集ID写错了,应该是 ZHS16GBK
      

  3.   

    呵呵,那CharSetForm 和 CharSetID有啥区别?
    Form我知道是啥?ID呢?
    一个CharSetID可以包含多个不同的CharSetForm么?
      

  4.   

    我理解的是:setCharSetForm()设置字符集的形式,参数是CharSetForm(形式,有四种),OCCI_SQLCS_IMPLICIT是其中一种,表示,使用本地数据库的字符集,设置了这个形式可以不用设置CharSetID;
    也可以直接设置,setCharSetId() 设置CLOB字符集,也就是ZHS16GBK或UTF-8我试了这两种方式可行,但不理解其他字符集形式怎么用字符集的形式:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14294/reference002.htm