第一个问题:我在做留言板程序时,因为留言数据可能较大需要将保存留言内容的字段gst_content设为TEXT类型允许为NULL,当留言为空时用rs.getString("gst_content")读取该字段会报如下错误:
 Servlet.service() for servlet jsp threw exception
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Underlying input stream returned zero bytes
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseData.getString(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getString(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getString(Unknown Source)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:224)
at org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:177)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
不为空时读取正常,请问该用什么方式读取为空字符串的TEXT字段才不会出错?第二个问题:我想保存留言的时间,就用了一个TIMESTAMP类型的字段gst_time,但用rs.getTimestamp()方法读时又产生了
类型不能转换的错误,请问SQLSERVER中有什么方式可以保存更改数据的时间,好像MYSQL可以。我应用什么方式保存这个时间?有实现代码更好。
      这是我第一次求助,希望大家知道多少说多少,谢谢了! 
      加一百分,不够我再加哦!

解决方案 »

  1.   

    第一个问题的回答:替换一下sqlserver最新驱动,或在应用中增加对null的判断,给个空字串就ok了
      

  2.   

    数据库操作代码如下:
                Context ctx=new InitialContext();
                DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/bookstore");
                Connection conn=ds.getConnection();
                
                //创建可滚动的结果集。
    Statement stmt=conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY);
    ResultSet rs=stmt.executeQuery("select     gst_user,gst_time,gst_ip,gst_title,gst_content from guestbook order by gst_time desc");
    然后取出:
    String time = rs.getString("gst_time");
    out.println("留言时间:"+time);
    out.println("  ");
    out.println("用户IP:"+rs.getString("gst_ip")+"<br>");
    out.println("主题:"+rs.getString("gst_title")+"<br>");

    out.println("内容:"+rs.getString("gst_content"));
      

  3.   

    谢谢楼上的回复:
    请问zdjava() :
    最新的驱动是什么版本,在哪下?
      

  4.   

    就是用的insert语句:String name=request.getParameter("name");
    String title=request.getParameter("title");
    String content=request.getParameter("content");
    Context ctx=new InitialContext();
        DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/bookstore");
        Connection conn=ds.getConnection();

    PreparedStatement pstmt=conn.prepareStatement(
    "insert into guestbook(gst_user,gst_title,gst_content,gst_ip) values(?,?,?,?)");
    pstmt.setString(1,name);
    pstmt.setString(2,title);
    pstmt.setString(3,content);
    pstmt.setString(4,fromIP);

    pstmt.executeUpdate();
    pstmt.close();
    conn.close();
      

  5.   

    你可以在插入前判断,如果是NULL,就给他初始化为""第二个问题你用rs.getString()方法把时间读出来再用SimpleDateFormat格式化下就OK了如:System.out.println(sDateFormat.format(sDateFormat.parse("2006-07-11 16:51:29.747")));
      

  6.   

    谢谢水木年华的答复:
       第一个问题通过下载SQLSERVER2005的驱动已经解决,可能是微软以前的驱动不支持TEXT类型。
       第一个问题,TIMESTAMP类型用rs.getString()读出来的跟本不是时间,是一串长数字,不知为什么?
      

  7.   

    我每次把时间toString后入库的
      

  8.   

    谢谢回答
    可能是不能用那个类型
    应该用DATETIME SIMPLEDATETIME