结果集总是 returns 空,我不应该在准备好的语句中使用 executeQuery() 吗?
Result set always returns empty, should I not use executeQuery() on my prepared statement?
我有用户试图注册到一个站点。在他们可以注册之前,他们会在 SQL 数据库中搜索他们选择的用户名,以确保它不存在。
问题是名称永远不会被搜索,因为 ResultSet 总是 returns 为空。我认为这是准备好的声明。
我认为我准备好的语句没有执行。我正在使用 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
。我不认为有任何语法错误,因为 table 被称为 users
。我尝试的一切只会让我回到由空集导致的错误。如果您需要更多代码,请告诉我,但这是发生错误的地方。
谢谢!
您在使用 SELECT 语句时向数据库发出查询,因此您使用了 executeQuery() 方法。
看起来令人困惑的是您正在使用的 userNameCounter 变量。它在哪里声明以及它被声明为什么?看起来它可能是一个整数变量,这会让我问......你认为 rs.getString("username") 方法 returns 怎么样?
事实上……所有这些 rs.next() 语句的所有条件是什么?
整个事情相当混乱。如果你想查看用户名是否已经存在于数据库中 table 那么你可以这样做:
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 .我提供此代码只是为了让您了解如何实现它。
我有用户试图注册到一个站点。在他们可以注册之前,他们会在 SQL 数据库中搜索他们选择的用户名,以确保它不存在。 问题是名称永远不会被搜索,因为 ResultSet 总是 returns 为空。我认为这是准备好的声明。
我认为我准备好的语句没有执行。我正在使用 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
。我不认为有任何语法错误,因为 table 被称为 users
。我尝试的一切只会让我回到由空集导致的错误。如果您需要更多代码,请告诉我,但这是发生错误的地方。
谢谢!
您在使用 SELECT 语句时向数据库发出查询,因此您使用了 executeQuery() 方法。
看起来令人困惑的是您正在使用的 userNameCounter 变量。它在哪里声明以及它被声明为什么?看起来它可能是一个整数变量,这会让我问......你认为 rs.getString("username") 方法 returns 怎么样? 事实上……所有这些 rs.next() 语句的所有条件是什么?
整个事情相当混乱。如果你想查看用户名是否已经存在于数据库中 table 那么你可以这样做:
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 .我提供此代码只是为了让您了解如何实现它。