我正在编写一个java代码,用于验证和更新我的收入报告工具的登录凭据。
getName()
是询问用户名称然后交叉检查我的数据库以查找任何重复条目并相应添加的函数。
我的问题是,当我在启动时提供不同的名称时,它会将名称添加到数据库中。但是,当我提供重复的名称然后提供不同的名称时,它会给我这个错误:
Exception in thread "main" java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:804)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6986)
at database_console1.test2.getName(test2.java:67)
at database_console1.test2.getName(test2.java:74)
at database_console1.test2.getName(test2.java:74)
at database_console1.test2.getName(test2.java:74)
at database_console1.test2.getName(test2.java:74)
at database_console1.test2.getName(test2.java:74)
at database_console1.test2.main(test2.java:44)
Java Result: 1
BUILD SUCCESSFUL (total time: 20 seconds)
这是我的功能。
public void getName() throws SQLException {
String sqla = "SELECT * FROM veuser where UserName = ?" ;
String sql = "INSERT INTO veuser (UserName) VALUES (?)";
boolean b = true;
while (b) {
System.out.println("Enter your username");
name = sc.nextLine();
if (!"".equals(name)) {
b = false;
} else {
System.out.println("Username cant be left blank");
}
}
ps = conn.prepareStatement(sqla);
ps.setString(1, name);
rs = ps.executeQuery();
while (rs.next()) {
String i = rs.getString(2);
System.out.println(i);
if (i.equals(name)) {
System.out.println("User already exists.Choose another username");
getName();
}
}
os = conn.prepareStatement(sql);
os.setString(1, name);
int row = os.executeUpdate();
if (row > 0){
System.out.println("Successfully added...");
ps.close();
os.close();
}
答案 0 :(得分:3)
您的代码是重复的。你从它自己调用函数getName()但是在它返回之后第一次调用继续它的执行。
例如,假设您有用户名John,并且您到达此行:
if (i.equals(name)) {
System.out.println("User already exists.Choose another username");
getName();
}
用户名John已存在,您再次调用getName()。您将第二次调用中的名称设置为正确的名称。然后在第二次调用中插入行,返回第一次调用,尝试再次插入相同的名称。如果您尝试使用3-4个不同的名称并且全部失败,它将尝试最后进行3-4次插入。
你不应该再次调用getName(),而是构造if-else逻辑以返回方法的开头。
答案 1 :(得分:0)
问题是,如果您已经在使用相同的Statement,迭代它,则无法对Statement执行更新。
阅读此post