用java 存取oracle clob数据库时出现乱码,请问如何解决? 存取详细代码如下: 数据是从jsp页面传过来的大文本,本来在oracle 中定义了varchar2() ,但是只能存储4000字符数据,如果文章大于4000的话,存到数据库就会出现错误,所以我用clob来保存文本.但是数据存储后发现是乱码.请问怎样解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 已经解决 写数据时.我直接把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);} 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; } 数据库增量备份问题 Oracle9i在Solaris10平台上以silent方式安装时出现的DISPLAY的问题! oracle 关于SQL的一个问题(逗号分隔) about dataspace question 求助,如何优化这段SQL语句,求方法思路。 case when 问题! 关于SQL查询问题? 在WINDOWS客户端,能用SQLLOAD能将文本数据导入到后台服务器上吗?在线等待 为什么连接不到数据库? 可以装ORACLE9i吗? Oracle中怎样使用JAVA函数 能否多个表进行左联接操作啊,急!!!
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);
}
把一个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;
}