读取ORACLE10G的CLOB类型的内容时出错,当我输入超过10000的汉字时,读取的时候出错误

有关操作ORACLE10G的CLOB类型时出错,当我输入超过10000的汉字时,保存的时候没有出现异常,但是当我读取或者编辑的时候就出现如下错误:
java.io.IOException: 不能在 UTF8 和 UCS2 之间转换
at oracle.jdbc.dbaccess.DBError.SQLToIOException(DBError.java:625)
at oracle.jdbc.driver.OracleClobReader.needChars(OracleClobReader.java:178)
at oracle.jdbc.driver.OracleClobReader.read(OracleClobReader.java:133)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at pde.ams.database.jdbc.JdbcDao.getContent(JdbcDao.java:548)
at pde.ams.business.action.WClassAction.getContent(WClassAction.java:355)
at org.apache.jsp.index.showContent_jsp._jspService(showContent_jsp.java:218)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at pde.ams.filters.AmsFilter.doFilter(AmsFilter.java:82)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)
[2010-01-11 16:43:29] ERROR (JdbcDao.java:563) java.io.IOException: 不能在 UTF8 和 UCS2 之间转换

而我操作的代码如下:

public String getContent(String tableName, String contentFD, String ID)
  throws SQLException {
  Statement statement = null;
  ResultSet rs = null;
  String content = "" ;
  //Add start 2010-01-11 Rongdajian
  StringBuffer sb = new StringBuffer();
  //Add end 2010-01-11 Rongdajian
  try {
  statement = connection.createStatement();
  rs = statement.executeQuery("select " + contentFD + " from "
    + tableName + " where ID = '" + ID + "' ");
  if (rs.next()) {
    oracle.sql.CLOB clob = (oracle.sql.CLOB) (rs.getClob(1));
    if (clob != null) {
    //得到流
    Reader is = clob.getCharacterStream();
    BufferedReader br = new BufferedReader(is);
    String s = br.readLine();
    while (s != null) {
      //Modify start 2010-01-11 Rongdajian
      //content += s;
      sb.append(s) ;
      //Modify end 2010-01-11 Rongdajian
      s = br.readLine();
    }
    br.close();
    is.close();
    }
  }
  } catch (Exception e) {
  statement.close();
  e.printStackTrace();
  logger.error(e);
  } finally {
  rs.close();
  statement.close();
  }
  //Add start 2010-01-11 Rongdajian
  content = sb.toString() ;
  //Add end 2010-01-11 Rongdajian
  return content ;

解决办法:

oracle 官方文档 CLOB 10g
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html

 

到官网下载最新的ORACLE10G的class12.jar驱动包,然后再将代码修改成如下:

public String getContent(String tableName, String contentFD, String ID)
   throws SQLException {
  Statement statement = null;
  ResultSet rs = null;
  String content = "" ;
  //Add start 2010-01-11 Rongdajian
  //StringBuffer sb = new StringBuffer();
  //Add end 2010-01-11 Rongdajian
  try {
   statement = connection.createStatement();
   rs = statement.executeQuery("select " + contentFD + " from "
     + tableName + " where ID = '" + ID + "' ");
   if (rs.next()) {
    //Modify start 2010-01-11 Rongdajian
    //oracle.sql.CLOB clob = (oracle.sql.CLOB) (rs.getClob(1));
    //if (clob != null) {
    // //得到流
    // Reader is = clob.getCharacterStream();
    // BufferedReader br = new BufferedReader(clob.getCharacterStream());
    // String s = br.readLine();
    // while (s != null) {
    //  //content += s;
    //  sb.append(s) ;
    //  s = br.readLine();
    // }
    // br.close();
    // is.close();
    //}
    //取得CLOB类型文章内容
    //ORACLE10G后对于取CLOB的值进行了优化 Get the CLOB value larger than 32765 bytes from the resultset
    content = rs.getString(1) ;
    //Modify end 2010-01-11 Rongdajian
   }
  } catch (Exception e) {
   statement.close();
   e.printStackTrace();
   logger.error(e);
  } finally {
   rs.close();
   statement.close();
  }
  return content ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值