<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>connect the db</title>
</head><%@ page import="java.sql.*"%><body bgcolor="#ffffff"><%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:JSPuser"; // message_DSN 为你的用户数据源名称;
String user="";
String password=""; // 用户名和密码在此都设为空;
String name;
String pwd;
String c;
name=request.getParameter("name");
pwd=request.getParameter("pwd");
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement();
String sql="select * from TBuser where name='"+name+"';";
String pd="select * from TBuser where password='"+pwd+"';";
ResultSet rs1=stmt.executeQuery(pd);
ResultSet rs=stmt.executeQuery(sql);
%>
<%
if ((rs1.getString(2)).equals(rs.getString(2)))
out.println("OK");
else
out.println("Error");
%><%rs.close();
rs1.close();
stmt.close();
conn.close();
%></body>
</html>
以上是JSP代码
问题是出现了
javax.servlet.ServletException: ResultSet is closed
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
org.apache.jsp.JSPco_jsp._jspService(JSPco_jsp.java:143)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause java.sql.SQLException: ResultSet is closed
sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(JdbcOdbcResultSet.java:6647)
sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:256)
org.apache.jsp.JSPco_jsp._jspService(JSPco_jsp.java:84)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)高手帮帮 怎么改

解决方案 »

  1.   

    在执行多个SQL语句时最好不要公用一个Statement 每个SQL语句用一个Statement肯定不会错
      

  2.   

    Statement stmt=conn.createStatement();
    Statement stmt1=conn.createStatement(); //这多生成一个Statement对象
    String sql="select * from TBuser where name='"+name+"';";
    String pd="select * from TBuser where password='"+pwd+"';";
    ResultSet rs1=stmt.executeQuery(pd);    //以下2句分别用不同的Statement对象执行
    ResultSet rs=stmt.executeQuery(sql);
      

  3.   

    ResultSet rs1=stmt1.executeQuery(pd);    //以下2句分别用不同的Statement对象执行
    ResultSet rs=stmt.executeQuery(sql);
      

  4.   

    改后代码:<%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title>connect the db</title>
    </head><%@ page import="java.sql.*"%><body bgcolor="#ffffff"><%
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String url="jdbc:odbc:JSPuser"; // message_DSN 为你的用户数据源名称;
    String user="";
    String password=""; // 用户名和密码在此都设为空;
    String name;
    String pwd;
    String c;
    name=request.getParameter("name");
    pwd=request.getParameter("pwd");
    Connection conn= DriverManager.getConnection(url,user,password);
    Statement stmt=conn.createStatement();

    String sql="select * from TBuser where name='"+name+"';";
    Statement stmt1=conn.createStatement();
    String pd="select * from TBuser where password='"+pwd+"';";
    ResultSet rs1=stmt.executeQuery(pd);
    ResultSet rs=stmt1.executeQuery(sql);
    %>
    <%
    if ((rs1.getString(2)).equals(rs.getString(2)))
    out.println("OK");
    else
    out.println("Error");
    %><%rs.close();
    rs1.close();
    stmt.close();
    stmt1.close();
    conn.close();
    %></body>
    </html>
    改后结果:
    javax.servlet.ServletException: [Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
    org.apache.jsp.JSPco_jsp._jspService(JSPco_jsp.java:98)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt
    sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
    sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
    sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
    sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
    sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253)
    org.apache.jsp.JSPco_jsp._jspService(JSPco_jsp.java:70)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
      

  5.   

    String sql="select * from TBuser where name='"+name+"';";
    String pd="select * from TBuser where password='"+pwd+"';";
    ResultSet rs1=stmt.executeQuery(pd);
    if(rs1.next()){
    String spassword=rs1.getString(2);
    ResultSet rs=stmt.executeQuery(sql);
    if(rs.next()){
    String sname=rs.getString(2);
    if (spassword.equals(sname))
    out.println("OK");
    else
    out.println("Error");
    %><%rs.close();
    rs1.close();
      

  6.   

    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title>connect the db</title>
    </head><%@ page import="java.sql.*"%><body bgcolor="#ffffff"><%
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String url="jdbc:odbc:JSPuser"; // message_DSN 为你的用户数据源名称;
    String user="";
    String password=""; // 用户名和密码在此都设为空;
    String name;
    String pwd;
    String c;
    name=request.getParameter("name");
    pwd=request.getParameter("pwd");
    Connection conn= DriverManager.getConnection(url,user,password);
    Statement stmt=conn.createStatement();String sql="select * from TBuser where name='"+name+"';";
    Statement stmt1=conn.createStatement();
    String pd="select * from TBuser where password='"+pwd+"';";
    ResultSet rs1=stmt.executeQuery(pd);
    ResultSet rs=stmt1.executeQuery(sql);
    Sting s1 = null;
    String s2 = null;
    while(rs.next())
    s1 = rs.getString(2) ;
    while(rs1.next())
    s2 = rs1.getString(2);if (s1!=null && s2!=null&&s1.equals(s2))
    out.println("OK");
    else
    out.println("Error");
    %><%rs.close();
    rs1.close();
    stmt.close();
    stmt1.close();
    conn.close();
    %></body>
    </html>
      

  7.   

    同意我楼上的观点,因为如果多个rs使用同一个stmt时,关闭的时候就有可能出先问题.
      

  8.   

    朋友
    还是出现了“连接战线”的问题
    我想问一下 我数据库似乎没什么问题
    应为我只是不用if..else...的时候就可以正常使用请朋友再帮助一下 谢谢了
      

  9.   

    Statement stmt=conn.createStatement();
    Statement stmt1=conn.createStatement(); //这多生成一个Statement对象
    String sql="select * from TBuser where name='"+name+"';";
    String pd="select * from TBuser where password='"+pwd+"';";
    ResultSet rs1=stmt1.executeQuery(pd);    //以下2句分别用不同的Statement对象执行
    String result1 = rs1.getString(2);
    ResultSet rs=stmt.executeQuery(sql);
    String result = rs.getString(2);
    if (result1.equals(result)){
      out.println("OK");
    }else{
      out.println("Error");
    }
    再试试~
      

  10.   

    楼主关闭结果集的语句语句应该这样:
    public void close(ResultSet result) {        if (result != null) {
                try {
                    result.close();
                }
                catch (SQLException se) {
                    result = null;
                }
                finally {
                    result = null;
                }
            }
    }
      

  11.   

    现在出现了
    [Microsoft][ODBC 驱动程序管理器] 无效的游标状态kevinliuu(@。@) 朋友的代码
    在判断Error时没有问题
    但是在输入用户名和密码都正确是出现了战线的问题 不知道谁能改一下
      

  12.   

    Statement stmt=conn.createStatement();
    Statement stmt1=conn.createStatement(); //这多生成一个Statement对象
    String sql="select * from TBuser where name='"+name+"';";
    String pd="select * from TBuser where password='"+pwd+"';";
    ResultSet rs1=stmt1.executeQuery(pd);    //以下2句分别用不同的Statement对象执行
    if(rs1.next()){
     String result1 = rs1.getString(2);
    }
    ResultSet rs=stmt.executeQuery(sql);
    if(rs.next()){
     String result = rs.getString(2);
    }
    if (result1.equals(result)){
      out.println("OK");
    }else{
      out.println("Error");
    }
    再试
      

  13.   

    D:\计算机安装\Tomcat 5.0\work\Catalina\localhost\JSPDL\org\apache\jsp\JSPco_jsp.java:98: 找不到符号
    符号: 变量 result
    位置: 类 org.apache.jsp.JSPco_jsp
    if (result1.equals(result)){
                       ^
    An error occurred at line: 12 in the jsp file: /JSPco.jsp
    Generated servlet error:
    D:\计算机安装\Tomcat 5.0\work\Catalina\localhost\JSPDL\org\apache\jsp\JSPco_jsp.java:98: 找不到符号
    符号: 变量 result1
    位置: 类 org.apache.jsp.JSPco_jsp
    if (result1.equals(result)){
        ^
    2 错误
      

  14.   

    朋友 你那个result,result1是局部变量 外面不能用
    所以我在前面声明了String result=null;
                      String result1=null;
    但是又出现了问题org.apache.jasper.JasperException
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause java.lang.NullPointerException
    org.apache.jsp.JSPco_jsp._jspService(JSPco_jsp.java:100)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
      

  15.   

    恩 不好意思上面复制粘贴后忘了改了 你把那两个result和result1分别输出一下 看看有没有值 看看从数据库里取出来没有
      

  16.   

    楼上说得不错。rs和rs1都必须next()一下.
      

  17.   

    不是那个问题 我上面给的if(rs1.next()) 已经包括了
      

  18.   

    谢谢大家这么帮助我我经过大家指点后 代码如下:<%@ page contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <title>connect the db</title>
    </head><%@ page import="java.sql.*"%><body bgcolor="#ffffff"><%
     try{
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String url="jdbc:odbc:JSPuser"; 
    String user="";
    String password=""; 
    String name;
    String pwd;
    String c;
    name=request.getParameter("name");
    pwd=request.getParameter("pwd");
    Connection conn= DriverManager.getConnection(url,user,password);
    Statement stmt=conn.createStatement();
    Statement stmt1=conn.createStatement(); 
    String sql="select * from TBuser where name='"+name+"';";
    String pd="select * from TBuser where                    password='"+pwd+"';";
    String result=null;
    String result1=null;

    ResultSet rs1=stmt1.executeQuery(pd); 
    ResultSet rs=stmt.executeQuery(sql);  

                               while(rs1.next())
                               {
      result1 = rs1.getString(2);
    }

    while(rs.next())
                               {
     result = rs.getString(2);
    }
    if (result1.equals(result))
                               {
      out.println("OK");
    }
                               else
                               {
      out.println("Error");
             }
    rs.close();
    rs1.close();
    stmt.close();
    stmt1.close();
    conn.close();
    }
    catch(Exception ex)
    {
    out.println(ex.getMessage());
    }
    %></body>
    </html>但是仍然出现了如下提示:[Microsoft][ODBC SQL Server Driver]连接占线导致另一个 hstmt我自己都不明白怎么弄了,但有的朋友说两个连接用两个线程,不知道对不对,反正目前我也感觉很老火,多谢各位了。
      

  19.   

    楼主
    Statement stmt=conn.createStatement();
    Statement stmt1=conn.createStatement(); //这多生成一个Statement对象
    String sql="select * from TBuser where name='"+name+"';";
    String pd="select * from TBuser where password='"+pwd+"';";
    String result1 = "";
    String result = "";
    ResultSet rs1=stmt1.executeQuery(pd);    //1
    if(rs1.next()){                          //2
     result1 = rs1.getString(2);             //3
    }                                        //4
    ResultSet rs=stmt.executeQuery(sql);     //5
    if(rs.next()){                           //6
     result = rs.getString(2);               //7
    }没发现那7行和你的有什么不同么? 是先做完一个取值 然后再取下一个 那样应该就不会占线了
      

  20.   

    没看懂什么意思啊
    似乎只有while 改成了 if 啊 
      

  21.   

    你是先取出2个ResultSet然后再分别取出值
    我是取1个ResultSet 取值 再取第2个ResultSet 取值
    还没明白?
      

  22.   

    客气了 我也是刚开始做J2EE的 也刚来CSDN不久 大家互相学习嘛 我们公司白天不让上QQ和MSN 我晚上加你吧