0

我在我的数据库中手动增加我的 ID 号,因为我无法让它自动工作。这是一个项目,如果它不能自动工作也没关系 - 我可以稍后尝试解决。

我正在创建一个方法来检查结果集中的最低空闲 ID 号。最低的将被设置为一个名为 availableId 的整数,用户将在注册时获得该整数。

这是我到目前为止阅读的内容:

http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html http://wiki.netbeans.org/GetStartedwithJavaDB

例如,这些是我在数据库中的 ID:

/,2,/,4,5,6,/,8,9

由于这些用户删除了他们的帐户,因此缺少 1、3 和 7。我想在填写任何其他人之前填写数字 1,然后下一个用户将注册为例如数字 3。

public int getAvailableId() {
    int availableId = 1;
    try {
        String stmt = "select PID from APP.PERSON";
        PreparedStatement ps = Main.getPreparedStatement(stmt);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            int n = rs.getInt(1);
            int n2 = rs.next().getInt(1);

            if (!(n == 1)) {
                return availableId;
            } else if (!(n2-- == n)) {
                availableId = n++;
            }
        }
        rs.close();
        ps.close();
    } catch (Exception e) {
        System.out.println(e);
    }
    return availableId;
}

这里有两个问题:

  1. rs.next()返回一个布尔值,但我希望 n2 在下一行中保存整数的值 - 我找不到从这里执行此操作的方法 - http://docs.oracle.com/javase/6/docs/api /java/sql/ResultSet.html
  2. 我不知道如何遍历所有内容以找到可能的最低免费 ID 号。

请原谅垃圾代码!随着我的发展,我学到了很多东西,我知道这对一和二来说是不好的做法,代码不是很好。

我该怎么做呢?

4

1 回答 1

1

您的代码略有错误。这需要改变:

rs.next().getInt(1);

只是:

rs.getInt("PID");

rs.next()做两件事。如果有下一行,则返回 true,然后将结果集游标移动到下一行。

当没有下一行时,它将返回 false 并因此中断循环。

当您调用getInt它时,它将尝试从当前行中检索 int。如您所见rs.next(),循环中的条件每次都会将其移动到下一行。


同样在这种情况下,您需要声明

int n在循环之外。

然后n = n2在每次循环迭代结束时分配。

像这样的东西:

    int n = 0;
    while (rs.next()) {

        int n2 = rs.getInt(1);

        if (!(n == 1)) {
            return availableId;
        } else if (!(n2-- == n)) {
            availableId = n++;
        }

        n = n2;
    }

您可能需要玩弄它才能让它完全按照您的意愿行事。


我的最后评论,不要费心试图获得尽可能低的免费 ID 号码,只需使用 SQL MAX() 或其他东西从数据库中获取最高号码,然后加 1。

于 2013-02-15T15:48:13.283 回答