我手动递增我的数据库中的ID号,因为我无法让它自动运行。这是一个项目,如果它不能自动运行也没关系 - 我可以尝试以后解决。
我正在创建一个方法,用于检查resultSet中最低的空闲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;
}
这里有两个问题:
rs.next()
返回一个布尔值,但是我希望n2在下一行中保存整数的值 - 我找不到从这里执行此操作的方法 - http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html 请原谅垃圾代码!随着我的进展,我学到了很多东西,我明白这对于一两个代码来说不是很好。
我该怎么做呢?
答案 0 :(得分: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。