【问题标题】:Result set always returns empty, should I not use executeQuery() on my prepared statement?结果集总是返回空,我不应该在准备好的语句上使用 executeQuery() 吗?
【发布时间】:2019-08-26 19:02:16
【问题描述】:

我有用户尝试注册到网站。在他们可以注册之前,在 SQL 数据库中搜索他们选择的用户名,以确保它不存在。 问题是永远不会搜索名称,因为 ResultSet 总是返回空。我认为这是准备好的声明。

我认为我准备好的语句没有执行。我正在使用executeQuery() 执行我的语句,因为这就是我插入用户名的方式,没有任何问题。我从插入用户名的方法中得到了搜索结果集部分if (rs.next())...。与String SQL 和准备好的语句相同。

String SQL = "SELECT * FROM users WHERE username='" + getUsername() + "'";

    System.out.println(SQL);
    // prints out SELECT * FROM users WHERE username='whatever I searched'
    // so this String is valid
    if (db.getConn() != null){
        System.out.println("connected to database");
        // always prints
    }
    PreparedStatement preparedStatement = db.getConn().prepareStatement(SQL);
   // preparedStatement.setString(1, getUsername());
    ResultSet rs = preparedStatement.executeQuery();
//    userNameCounter = rs.getString("username");
    // putting this here returns an sqlexception. empty set
if (preparedStatement != null){
        System.out.println("ps != null");
        // prints this
    }
    if (rs != null){
        System.out.println("rs != null");
        // prints this
    }
    if (!rs.next()){
        System.out.println("!rs.next");
        // prints this
    }
    if (rs.next()) {
        userNameCounter = rs.getString("username");
        System.out.println("rs.next()");
        // doesn't print
        // so the resultset is empty

        if (!userNameCounter.equals(getUsername())) {
            System.out.println("that username is unique");
            return true;
        }
    }
    preparedStatement.close();
    incorrectLabels.setText("That username is already taken");
    incorrectLabels.setVisible(true);
    System.out.println("that username is already there");
    // this always prints. it shouldn't
    return false;

所以executeUpdate() 需要int 但我不确定我会放在那里。只做execute() 会引发错误Requires ResultSet found boolean。我认为没有任何语法错误,因为该表称为users。我尝试的一切只会让我回到由空集导致的错误。如果您需要更多代码,请告诉我,但这是发生错误的地方。

谢谢!

【问题讨论】:

  • 您应该准备您的声明使用占位符值。这里面有一个SQL injection bug
  • 为什么不打印getUserName()
  • @AndrewLazarus getUserName() 打印出正确的用户名。
  • @tadman 问题不是注入错误,当我更改为占位符然后打印 String SQL 它会打印 SELECT * FROM users WHERE username=?不确定“?”是否应打印为搜索的用户名。也不能修复空结果集
  • 如果结果集为空,仅表示没有给定用户名的用户。

标签: java mysql prepared-statement resultset


【解决方案1】:

您在使用 SELECT 语句时向数据库发出查询,因此您使用 executeQuery() 方法。

看起来令人困惑的是您正在使用的 userNameCounter 变量。它在哪里声明,它声明为什么?看起来它可能是一个整数变量,这会让我问......你认为 rs.getString("username") 方法返回什么? 事实上...所有这些 if 语句的所有 rs.next() 条件是什么?

整个事情相当混乱。如果您想查看数据库表中是否已经存在用户名,那么您可以这样做:

if (db.getConn() == null){
    throw new RuntimeException("Method Error! You Are NOT Connected To Database!");
}

String suppliedUserName = getUsername();
String dbUserName = "";
String SQL = "SELECT username FROM users WHERE username=?";

PreparedStatement preparedStatement = db.getConn().prepareStatement(SQL);
preparedStatement.setString(1, suppliedUserName);
ResultSet rs = preparedStatement.executeQuery();

while (rs.next()) {
    dbUserName = rs.getString("username");
}
rs.close()
preparedStatement.close()

/* Below we use the equalsIgnoreCase() method. You 
   don't want a supplied User Name to be that close 
   or that similar to another User Name already in 
   Database. If you do then just use equals() method.  */
if (dbUserName.equalsIgnoreCase(suppliedUserName)) {
    System.out.println("The User name (" + suppliedUserName + 
                ") is already in use. Try another User Name.");
    return false;
}
else {
    System.out.println("The User name (" + suppliedUserName + ") is Unique.");
    return true;
}

当然,这段代码没有经过测试,我假设您已经准备好 try/catch 来处理任何 SQLException。我只是提供此代码,让您了解如何实现它。

【讨论】:

  • 是的,我知道它有多令人困惑。所有rs.next() 的东西和打印出来的东西只是让我看看哪里出了问题。我认为向其他人展示我尝试过的方法/我发现问题的地方可能会有所帮助。谢谢您的帮助!它解决了我的问题!
猜你喜欢
  • 2021-08-02
  • 2020-12-29
  • 2015-01-26
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多