我用getString读取一个sql server的text字段,字段内的字符数量大于27013时就出现错误,减少字符数量到27012就没事,用asp可以正常读取。难道java读取太大的字符串会有问题吗?下面是错误信息:
java.sql.SQLException: The amount of data read from the stream is not = length. at net.sourceforge.jtds.jdbc.ClobImpl.getSubString(ClobImpl.java:256) at net.sourceforge.jtds.jdbc.Support.convert(Support.java:316) at net.sourceforge.jtds.jdbc.JtdsResultSet.getString(JtdsResultSet.java:839) at net.sourceforge.jtds.jdbc.JtdsResultSet.getString(JtdsResultSet.java:1111) at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:216) at com.cy81.web.information.dao.PublicMethodBean.getArticle(PublicMethodBean.java:1863) at com.cy81.web.information.article.ArticleAction.execute(ArticleAction.java:138) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2416) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:601) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619) at java.lang.Thread.run(Thread.java:534)

解决方案 »

  1.   

    代码如下:
      public Article getArticle(String code) {
        StrutsDao sd = new StrutsDao(context);
        Article article = null;
        try {
          ResultSet rs = null;
          StringBuffer sqlQuery = new StringBuffer();
          sqlQuery.append("select * from WEB_TD_ARTICLE");
          sqlQuery.append(" where ArticleId=" + code);
          //System.out.println("sql:"+sqlQuery.toString());
          rs = sd.executeQuery(sqlQuery.toString());
          if (rs.next()) {
            article = new Article();
            article.setArticleId(rs.getInt("ArticleId"));
            article.setPromUserId(userCode);
            article.setPromUserName(userName);
            article.setAuthor(rs.getString("Author"));
            article.setVisitTimes(rs.getInt("VisitTimes"));
            article.setIsAudit(rs.getInt("IsAudit"));
            article.setContent(rs.getString("Content"));//就这句出错。
          }
          rs.close();
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }
        sd.close();
        return article;
      }
      

  2.   

    读数据库中的大型对象的时候,一把毛宁的方法好像是不行的rs.getObject(); rs.getBlob();rs.getClob()等
      

  3.   

    rs.getCharacterStream("Content");之后怎么变成String类型啊?
      

  4.   

    用Blob或者Clob
    Blob blob=rs.getBlob("content");
      

  5.   

    根据前面几位的说法我已经用rs.getCharacterStream("Content");种方式读取了,可是中文会出现乱码不知道为什么,转换的代码如下:
      public String getClobString(ResultSet rs, String colName) {
        try {
         Reader reader = rs.getCharacterStream(colName);
         if (reader == null) {
          return null;
         }
         StringBuffer sb = new StringBuffer();
         char[] charbuf = new char[4096];
         for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
          sb.append(charbuf, 0, i);
         }
         return sb.toString();
        } catch (Exception e) {
         return "";
        }
       }
      

  6.   

    已经解决了,更新了jtds到1.2就没事了,原来是0.9.1看来是以前版本的bug。