我在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());
}
}
}
答案 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。这可以解决将值存储在字符串中而不是进行多次调用,或者切换到不同的驱动程序。