java.sql.SLQException:对空结果集的非法操作

时间:2016-12-22 12:56:34

标签: java sql jdbc

我在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()){

3 个答案:

答案 0 :(得分:2)

您的代码存在各种问题:

  • 您在=
  • 之后错过了and Permissao
  • 从您的代码中,您似乎正在寻找通过以下字段进行过滤的用户:用户名,密码和Permissao,因此您应该定义3个变量
  • 您正在尝试在选择任何行之前访问ResultSet(使用rs.getXXX)。在executeQuery方法之后,您需要填写"一个ResultSet,但他的索引没有指向任何有效的"数据库行"所以你需要调用" rs.next()"为了将索引移动到第一行。连续调用每次都会将索引移到1个位置之前,直到ResultSet结束。

话虽如此,你应该:

  1. 使用准备好的语句来阻止sql注入和其他错字/字符错误,因为它会自动转义参数值。

  2. 在准备好的声明中,使用?来定义您需要使用s.set<TypeOfField>

  3. 设置的参数
  4. 在使用ResultSet之前检查rs.get是否有行

  5. 在finally子句中关闭连接,语句和结果集,因此如果存在或没有异常,资源将被关闭。这样做可以防止由于您不再使用的资源打开导致的内存泄漏。

  6. 你应该有3个变量来执行选择:(我想)

    • String类型的用户名
    • String类型的密码
    • int / Integer类型的Permissao
  7. 尝试使用以下代码,根据您的需要进行调整。

        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访问值。