我在java中有一个登录系统,我想从数据库中获取用户,密码和用户类型。但是当我运行程序时,我得到了以下错误:java.sql.SLQException:对空结果集的非法操作 代码:
conn=MysqlConnect.ConnectDB();
String Sql="Select*from utilizador where Nome='" + Username +"' and Password='" + Password +"' and Permissao'" + Permissao + "'" ;
try{
pst=conn.prepareStatement(Sql);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(Sql);
int permissao = rs.getInt("Permissao");
String nome = rs.getString("Nome");
String password = rs.getString("Password");
if(rs.next()){
答案 0 :(得分:2)
您的代码存在各种问题:
=
and Permissao
rs.getXXX
)。在executeQuery
方法之后,您需要填写"一个ResultSet,但他的索引没有指向任何有效的"数据库行"所以你需要调用" rs.next()"为了将索引移动到第一行。连续调用每次都会将索引移到1个位置之前,直到ResultSet结束。话虽如此,你应该:
使用准备好的语句来阻止sql注入和其他错字/字符错误,因为它会自动转义参数值。
在准备好的声明中,使用?
来定义您需要使用s.set<TypeOfField>
在使用ResultSet
之前检查rs.get
是否有行
在finally子句中关闭连接,语句和结果集,因此如果存在或没有异常,资源将被关闭。这样做可以防止由于您不再使用的资源打开导致的内存泄漏。
你应该有3个变量来执行选择:(我想)
尝试使用以下代码,根据您的需要进行调整。
Connection c = DB.dbConnect(null);
PreparedStatement s = null;
ResultSet rs = null;
try {
final String SQL = " Select * from utilizador where Nome=? and Password=? and Permissao = ? ";
s = c.prepareStatement(SQL);
int i = 1;
s.setString(i++, Username);
s.setString(i++, Password);
s.setInt(i++, Permissao);
rs = s.executeQuery();
if (rs.next()) {
int permissao = rs.getInt("Permissao");
String nome = rs.getString("Nome");
String password = rs.getString("Password");
}
} catch (SQLException e) {
// exception handler
} finally {
try {
if (rs != null)
rs.close();
} catch (Exception e) {
}
try {
if (s != null)
s.close();
} catch (Exception e) {
}try {
if (c != null)
c.close();
} catch (Exception e) {
}
}
答案 1 :(得分:0)
显然,问题在于您的查询缺少正确的引号和空格。它应该是
String Sql="Select * from utilizador where Nome = '" + Username +"' and Password='" + Password +"' and Permissao = '" + Permissao + "'" ;
答案 2 :(得分:0)
糟糕的,难以理解的代码。
这是你的问题:
String nome = rs.getString("Nome");
String password = rs.getString("Password");
在检查是否有任何行之前,您尝试从ResultSet访问值。