Java servlet代码中的Resultset处理错误

Java servlet代码中的Resultset处理错误,java,servlets,jdbc,Java,Servlets,Jdbc,我在servlet中编写了一个用于登录检查的代码,我不知道为什么会出现类似java.sql.SQLException:No data found,如果我没有注释掉String s4=rs.getString(1)和out.println(s4)行这样的错误,如果我注释掉这行,我就没有得到任何错误 为什么会出现这样的错误?我找不到答案 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; im

我在servlet中编写了一个用于登录检查的代码,我不知道为什么会出现类似
java.sql.SQLException:No data found
,如果我没有注释掉
String s4=rs.getString(1)
out.println(s4)
行这样的错误,如果我注释掉这行,我就没有得到任何错误

为什么会出现这样的错误?我找不到答案

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class login extends HttpServlet {

    Connection conn;
    Statement stmt;
    ResultSet rs;
    String s = "";

    public void init() {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            conn = DriverManager.getConnection("Jdbc:Odbc:edsn");
            s = "Your information is connected ......";
        } catch (Exception e) {
            s = "Exception 1....." + e.getMessage();
        }
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws IOException, ServletException {
        res.setContentType("text/html;charset=UTF-8");
        PrintWriter out = res.getWriter();
        out.println(s);
        try {

            String ID = req.getParameter("T1");
            String query = "select * from user_db ";
            stmt = conn.createStatement();
            rs = stmt.executeQuery(query);
            out.println("user" + " " + "pass");
            while (rs.next()) {

                try {
                    if ((rs.getString(1)).equals(ID)) {
                        String s4 = rs.getString(1);
                        out.println(s4);

                        out.println("<html><body><h> login Pass.....:(</h></body></html>");

                    }

                } catch (Exception e) {
                    out.println(e);
                }
            }

        } catch (Exception e) {
            out.println("Unable To Show the info... . . ." + e.getMessage());
        }

    }
}
import java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.*;
导入javax.servlet.http.*;
导入java.sql.*;
公共类登录扩展了HttpServlet{
连接接头;
报表stmt;
结果集rs;
字符串s=“”;
公共void init(){
试一试{
forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
conn=DriverManager.getConnection(“Jdbc:Odbc:edsn”);
s=“您的信息已连接……”;
}捕获(例外e){
s=“异常1…”+e.getMessage();
}
}
public void doPost(HttpServletRequest-req、HttpServletResponse-res)
抛出IOException、ServletException{
res.setContentType(“text/html;charset=UTF-8”);
PrintWriter out=res.getWriter();
out.println(s);
试一试{
字符串ID=req.getParameter(“T1”);
String query=“从用户数据库中选择*”;
stmt=conn.createStatement();
rs=stmt.executeQuery(查询);
out.println(“用户“+”+“通过”);
while(rs.next()){
试一试{
如果((rs.getString(1)).equals(ID)){
字符串s4=rs.getString(1);
out.println(s4);
out.println(“登录密码…”:(“”);
}
}捕获(例外e){
out.println(e);
}
}
}捕获(例外e){
out.println(“无法显示信息…”+e.getMessage());
}
}
}

对连接、语句或结果集调用方法取决于加载的JDBC驱动程序。查询完成后,可以立即设置结果集的所有值,也可以根据需要从数据库中检索这些值,具体取决于驱动程序的实现


JdbcOdbcDriver在第二次调用getString后抛出SQLException。这可以通过将值存储在字符串中而不是多次调用,或者切换到其他驱动程序来解决。为什么要这样编写代码?查看整个表是非常浪费的。。。 只有木卫一。。。 为什么不改为:

ResultSet rs = null;
PreparedStatement st = null;
try {...
String ID = req.getParameter("T1"); 
            String query = "select 1 from user_db where col_name = ?"; 
            st = conn.prepareStatement(query);
            st.setString(1, ID);  
            rs = st.executeQuery();
if (rs.next()) {
  out.println(ID); 
  out.println("<html><body><h> login Pass.....:(</h></body></html>"); 
}
..

} finally {
if (rs != null) try { rs.close();}catch (Exception e) {}
if (st != null) try { st.close();}catch (Exception e) {}
}
ResultSet rs=null;
PreparedStatement st=null;
试试看。。。
字符串ID=req.getParameter(“T1”);
String query=“从用户数据库中选择1,其中col_name=?”;
st=conn.prepareStatement(查询);
st.setString(1,ID);
rs=圣执行机构();
如果(rs.next()){
out.println(ID);
out.println(“登录密码…”:(“”);
}
..
}最后{
如果(rs!=null),请尝试{rs.close();}捕获(异常e){}
如果(st!=null),请尝试{st.close();}捕获(异常e){}
}
注意,准备好的语句是缓存的,更适合频繁使用

你让数据库做它擅长的事情——搜索数据

选择1而不是选择*不会带回您真正不需要的数据

一般来说,返回的列和数据越多,jdbc的工作就越努力,所以只能得到您想要的 需要


并添加一个finally块,以始终正确关闭数据库连接

我会减少您发布的代码量,使其仅包含相关部分,并重新表述您的问题,以明确什么有效,什么无效。我可以通过将值存储在变量中并使用它来解决此问题,但我的问题是它不起作用的另一个原因ng.我认为Resultset值在一次使用后将为空,使用可能是存储值或显示值。我正确吗?@fgb我读了这篇文章,这对我很有帮助,但我有一个问题Resultset是应用程序功能,它依赖于数据库驱动程序吗?我是java新手。我认为驱动程序就像一座桥梁,在完成后建立连接ng连接所有操作都将是控制权移交给应用程序如何管理缓冲区或其他。我还有一个问题是,如果在生成结果集时数据库服务器位于另一个位置,而应用程序位于另一个位置,那么它存储在应用程序或数据库服务器中的什么位置?