读书人

第一次关于SQLSERVER2000中TEXT类型字

发布时间: 2011-12-25 23:21:20 作者: rapoo

第一次求助:关于SQLSERVER2000中TEXT类型字段读取和TIMESTAMP类型的两个问题。
第一个问题:

我在做留言板程序时,因为留言数据可能较大需要将保存留言内容的字段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可以。我应用什么方式保存这个时间?有实现代码更好。
这是我第一次求助,希望大家知道多少说多少,谢谢了!
加一百分,不够我再加哦!


[解决办法]
将留言内容默认值设置 为 " " 就可以了



[解决办法]
谢谢回复,
但默认设置后,当保存空的留言到这个字段的时候又为 " "了
有没有更好的解决方法?
[解决办法]
还有你数据库操作的代码贴出来 给大家看看
[解决办法]
第一个问题的回答:替换一下sqlserver最新驱动,或在应用中增加对null的判断,给个空字串就ok了
------解决方案--------------------


数据库操作代码如下:
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 "));

[解决办法]
谢谢楼上的回复:
请问zdjava() :
最新的驱动是什么版本,在哪下?
[解决办法]
通过下载驱动,第一个问题已解决,谢谢!
[解决办法]
我说的是你插入数据的时候怎么插入的
[解决办法]
就是用的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();
[解决办法]
你可以在插入前判断,如果是NULL,就给他初始化为 " "

第二个问题你用rs.getString()方法把时间读出来

再用SimpleDateFormat格式化下就OK了

如:

System.out.println(sDateFormat.format(sDateFormat.parse( "2006-07-11 16:51:29.747 ")));
[解决办法]
谢谢水木年华的答复:
第一个问题通过下载SQLSERVER2005的驱动已经解决,可能是微软以前的驱动不支持TEXT类型。
第一个问题,TIMESTAMP类型用rs.getString()读出来的跟本不是时间,是一串长数字,不知为什么?
[解决办法]
我每次把时间toString后入库的。。。

[解决办法]
谢谢回答
可能是不能用那个类型
应该用DATETIME SIMPLEDATETIME

读书人网 >Java Web开发

热点推荐