数据是从jsp页面传过来的大文本,本来在oracle 中定义了varchar2() ,但是只能存储4000字符数据,如果文章大于4000的话,存到数据库就会出现错误,所以我用clob来保存文本.但是数据存储后发现是乱码.请问怎样解决?

解决方案 »

  1.   

    已经解决  写数据时.我直接把String字符串写进clob字段的列里.
     String data= dataInfo.getDetail();
            cs.setString(3, data);
     
    取数据:
      java.sql.Clob clob = null;            
    String rtn = null;
     while (rs.next())
            { 
                // 5 是clob类型字段
                clob =  rs.getClob(5);
                long longLen = clob.length();
                rtn = clob.getSubString(1L, (int) longLen);

      

  2.   

    to 楼上,以下是使用blob读出写入Blob字段jsp
    把一个CString类型变量的值加到一个clob里面,  
    m_pRecordset->Fields->GetItem("clobname")->AppendChunk(_variant_t(str));  
    这样写好像写不进去,有什么方法和以实现这一操作吗?  
     
    该是blob吧  
    参考代码:  
    //其中m_pRs为_RecordsetPtr  
    //写入  
    void  CAdoBlob::SetBlob(BYTE  *  pBuf,  long  nSize)  
    {  
               VARIANT      varBLOB;  
               SAFEARRAY    *  psa;  
               SAFEARRAYBOUND  rgsabound[1];  
                 
               if(pBuf)  
               {          
                           rgsabound[0].lLbound  =  0;  
                           rgsabound[0].cElements  =  nSize;  
                           psa  =  SafeArrayCreate(VT_UI1,  1,  rgsabound);  
                           for(long  i  =  0;  i  <  (long)nSize;  i++)  
                                       SafeArrayPutElement  (psa,  &i,  pBuf++);  
                           varBLOB.vt  =  VT_ARRAY    |  VT_UI1;  
                           varBLOB.parray  =  psa;  
                             
                           m_pRs->GetFields()->GetItem("F_DATA")->AppendChunk(varBLOB);//F_DATA为字段名称  
                           m_pRs->Update();  
               }  
    }  
    //读出  
    BOOL  CAdoBlob::GetBlob(BYTE  *  pBuf,  long  &  nSize)  
    {  
               nSize  =  m_pRs->GetFields()->GetItem("F_DATA")->ActualSize;  //得到数据的长度  
               if(nSize  >  0)  
               {  
                           _variant_t  varBLOB;  
                           varBLOB  =  m_pRs->GetFields()->GetItem("F_DATA")->GetChunk(nSize);  
                           if(varBLOB.vt  ==  (VT_ARRAY    |  VT_UI1))                                    //判断数据类型是否正确  
                           {  
                                       char  *p  =  NULL;  
                                       SafeArrayAccessData  (varBLOB.parray,(void  **)&p);    //得到指向数据的指针  
                                       pBuf=new  BYTE[nSize+1];  
                                       memcpy(pBuf,p,nSize);  
                                       pBuf[nSize]='\0';  
                                       SafeArrayUnaccessData  (varBLOB.parray);  
                                       return  TRUE;  
                           }  
               }  
               return  FALSE;  
    }