把项目工程部署到linux环境,在导完数据库后,某张表有大字段Clob并有初始化数据;功能测试出关联该表的功能点出现1029数据存取异常;
检查代码没有发现有关SQL的问题,所以感觉应该是数据类型的问题;
原先在window环境中,直接在功能点中创建该表对应的VO,大字段也没处理直接String取得;(此大字段为HTML格式的Table),页面展示也没什么问题;
解决办法:
修改VO,把大字段的类型该为Clob,从数据库中取得该Clob后转成String类型
//通过id获取vo
OnlineHelpVo bean = getBs().find(request.getParameter(REQUEST_ID));
//把clob大字段转成string
String content = clob2String(bean.getHelp_content());
--到了这里因为页面展示的是String类型数据;Clob类型数据不出来
这里我用了个笨方法,在VO中再加入一个Stirng类型的字段用来存放转义后的大字段;
如:bean.setContent(content);
request.setAttribute(REQUEST_BEAN, bean);
在页面输出这个content好了,就不输出help_content了,好笨!
//以下可作为Clob转换String的公共方法
public final static String clob2String(Clob clob)
{
if (clob == null)
{
return null;
}
StringBuffer sb = new StringBuffer(65535);//64K
Reader clobStream = null;//创建一个输入流对象
try
{
clobStream = clob.getCharacterStream();
char[] b = new char[60000];//每次获取60K
int i = 0;
while((i = clobStream.read(b)) != -1)
{
sb.append(b,0,i);
}
}
catch(Exception ex)
{
sb = null;
}
finally
{
try
{
if (clobStream != null)
clobStream.close();
}
catch (Exception e)
{
}
}
if (sb == null)
return null;
else
return sb.toString();
}
//以下可作为String转换Clob的公共方法
public static Clob stringToClob(String str) {
if (null == str)
return null;
else {
try {
java.sql.Clob c = new javax.sql.rowset.serial.SerialClob(str
.toCharArray());
return c;
} catch (Exception e) {
return null;
}
}
}