servlet代码中的结果集处理错误

时间:2012-01-05 18:14:17

标签: 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.*;
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());
        }

    }
}

2 个答案:

答案 0 :(得分:1)

为什么要写这样的代码?整张桌子都很浪费...... 只有IO ...... 为什么不改变这个:

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) {}
}

通知准备好的语句被缓存,更好地经常使用

你让数据库尽其所能 - 搜索数据

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

jdbc通常会返回更多的列和数据,因此只能得到你的东西 需要

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

答案 1 :(得分:0)

在Connection,Statement或ResultSet上调用方法取决于您加载的JDBC驱动程序。可以在查询完成后立即设置ResultSet的所有值,也可以根据需要从数据库中检索它们,具体取决于驱动程序的实现。

JdbcOdbcDriver在第二次调用getString后抛出SQLException。这可以解决将值存储在字符串中而不是进行多次调用,或者切换到不同的驱动程序。