读取ORACLE10G的CLOB类型的内容时出错,当我输入超过10000的汉字时,读取的时候出错误
2010-01-13 10:58
274 查看
有关操作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 ;
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 ;
相关文章推荐
- 【C#】解决进行反序列化时出错:。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。
- 如何解决 tomcat 下 oracle 缓冲池 读取 clob 字段内容 时的错误 "java.lang.ClassCastException: org.apache.commons.dbcp.DelegatingResultSet "
- InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
- 编写jsp页面的时候,直接在页面里输入汉字,保存时出现编码错误
- InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
- 如何往clob类型中插入一个超过10000 bytes 的字符串
- 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult。InnerException 消息是“反序列化对象 属于类型 lzdt.DTO.Dtolzdt[] 时出现错误。读取 XML 数据时,超出最大
- TEMP表空间未建导致XMLTYPE类型内容读取错误
- 用正则验证用户输入文本框的内容时候是中文汉字
- 对双向链表的处理,单个,但是,有错误,就是在输入越界 时候,没有执行出错处理
- oracle varchar2改成大字段类型clob,读取大字段内容
- 转----Oracle中Clob类型处理解析(NHibernate long值绑定long列,或者是直接oraclecommand的插入的时候报错都可以用,ORA-01461:仅可以插入LONG列的LONG值赋值)
- Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示
- ListView的Adapter有多个ViewHolder的时候导致的ViewHolder类型转换错误!
- 谈谈有关各数据库Blob、Clob类型字段的读取、保存更新
- 关于正则表达式的使用一例。在Textbox 对话框内限制只能输入数字,如果输入出错,则清空内容。
- 不一般的错误:“从数据类型 nvarchar 转换为 numeric 时出错”
- textbox.text被赋值后无法得到用户重新输入的内容--[低级错误忘记在 Page_Load()里面加if (!IsPostBack) ]
- 实现最多输入20个汉字(英文算半个汉字,奇数个英文算一个汉字),超过20个汉字后不能输入
- HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。