这几天都在学习着用JDBC连接sql server2000。用的是jdk1.6.0_16, Tomcat 6.0, sql server2000。发现的问题如下:<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head><body>
<%
Connection conn=null;
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test1";
String user="sa";
String pass="1";

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

conn=DriverManager.getConnection(url,user,pass);

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery("select * from username1");

while(rs.next())
{
out.print("Content1: " + rs.getString("content1") + " || " + "Content2: " + rs.getString("content2")+ " || " + "Content1: "+  + rs.getString("content1"));
}

rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
问题出现在while语句里面。当我把content1拿出来以后,在后面想再拿多一次的时候,页面就报了这个错误:description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 26 in the jsp file: /test1.jsp
The operator + is undefined for the argument type(s) String
23: 
24:  while(rs.next())
25:  {
26:  out.print("Content1: " + rs.getString("content1") + " || " + "Content2: " + rs.getString("content2")+ " || " + "Content1: "+  + rs.getString("content1"));
27:  }
28: 
29:  rs.close();
Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
如果我把后面 + "Content1: "+  + rs.getString("content1")删除,是没有任何问题的。请问各位有遇到这个问题吗?大家是如何解决的呢?请各位大侠分享分享心得~其实这个问题是我的一个朋友提出来的,他说他最后用了JTBC解决的。我上网搜过,好像只有.net,php,asp的版本。

解决方案 »

  1.   

    这个content1 在数据库中是哪种类型啊?int rs.getInt("content1") varchar rs.getString("content1").一次类推,看看rs到底还有那些get方法都是一次,我就不信他还敢出错
      

  2.   

    红色部分为什么是这样 ?  " || " + "Content1: " +  + rs.getString("content1")); 
      

  3.   

    先一句一句的输出,
    out.print("Content1: " + rs.getString("content1") 
    out.print("Content2: " + rs.getString("content2") 
    out.print("Content3: " + rs.getString("content3") 在组合输出试试
    要和数据库类型对应
      

  4.   

    额。有这样的问题,没有试过 rs.getString("a")后,再取一次 rs.getStirng("a")。如果是这个问题的话,那以实践出来的结论为准。并不是jdbc有bug,你要看rreslutset的用法说明。
      

  5.   

    真仔细
    JDBC没有bug的
    你的代码错误
      

  6.   


    试过了,不过是以这样的形式:
    out.print("Content1: " + rs.getString("content1")
    out.print("Content2: " + rs.getString("content2")
    out.print("Content1: " + rs.getString("content1")结果是不行的。唯一我想到可行的是把要重复的content1扔进一个变量。ResultSet rs=stmt.executeQuery("select * from username1"); String temp=null;while(rs.next()) 

    temp=rs.getString("content1");
    out.print("Content1: " + temp + " || " + "Content2: " + rs.getString("content2")+ " || " + "Content1: "+  + temp); 
    } 这样就不会报错。不过我在寻找比这个更好的解决方法。
      

  7.   

    在jsp 页面走个断点 看看 数据。print一下
      

  8.   

    记录集rs.next只能是取一次的。
      

  9.   

    out.print("Content1: " + rs.getString("content1") 
    out.print("Content2: " + rs.getString("content2") 
    out.print("Content1: " + rs.getString("content1") 
    ResutlSet  这个是顺序读取的 用这个类就要遵守规则 要是想不按顺序去 可以用javax.servlet.jsp.jstl.sql 包下的 Result 类  这个类  可以不按顺序取数据 
      

  10.   

    顺序读取是ResutlSet  的读取规则    javax.servlet.jsp.jstl.sql 包下的 Result 类的对象可以不按顺序读取  这个不是bug   这里也是要注意的地方  
      

  11.   


    第一次听说就应该记住   ResultSet  是顺序读取  不能回头读取 
      

  12.   


    首先,你要建一个表。那个表的content1和content2的类型都是text的,这个bug是针对text类型的数据。varchar是没有问题的。第二,你要把那个+号删除了。本来我想编辑一下原帖,可是找不到哪里可以编辑,都说我限权不够。
      

  13.   

    Connection conn=null; 
    String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test1"; 
    String user="sa"; 
    String pass="1"; Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); conn=DriverManager.getConnection(url,user,pass); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from username1");  Result result = ResultSupport.toResult(rs);
    for(int i = 0 ; i < result.getRowCount() ; i ++){
        Map map = result.getRows()[i];
        System.out.println("content3"+map.get("content3"));
        System.out.println("content1"+map.get("content1"));
    }说明:
    ResultSupport.toResult(rs);  把ResultSet结果集转换成Result 结果集  
    Result  结果集里是以Map  方式存储数据的  每一行数据是一个Map 字段名为Key字段值为value  
    你试试看
      

  14.   

    map是按照key取value的  可以不按照字段的顺序
      

  15.   

    javax.servlet.jsp.jstl.sql   包别导错了  Result 和ResultSupport 都是这个包下的 
      

  16.   


    Result result = ResultSupport.toResult(rs);
    这里是Result 还是ResultSet?
      

  17.   

    rs参数  就是你上边定义的 ResultSet 对象
    Result  这个是javax.servlet.jstl.jsp.sql包下的类  Result result = ResultSupport.toResult(rs); 就是把  上面的ResultSet  对象转化程Result 对象