java: 结果集错误

标签 java jdbc

我正在编写一个 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();              
    }

最佳答案

您的代码是递归的。您从自身调用函数 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 逻辑以返回到方法的开头。

关于java: 结果集错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30161567/

相关文章:

java - JDBC Derby 高分实现

java - 无法运行 GWT ServiceAsync

java - gRPC 服务器 (Java) 不会根据添加顺序公开服务

java - 使用数据库中的数据创建 JSON 数组

java - 如何执行带有变量作为 WHERE 的 SQL 语句?

java - 更新mysql中的记录时出现语法错误异常

java - 使用时间戳的准备语句需要更多纳秒

java - 返回到 switch 中的过去的情况

java - 在枚举中实现接口(interface)时,为什么 eclipse 会自动在被覆盖的接口(interface)方法之前放置一个分号?

Java - 绘制背景问题