JDBC: empty/null 结果集?
JDBC: empty/null result set?
我正在尝试使用 JDBC 更新 table。 table 由两个属性组成,A 和 B。主键是 A 和 B 的复合键。它看起来像这样:
A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
现在我希望能够根据我选择的 A 属性向此 table 添加一个新条目。它应该添加另一个,递增 1。例如,如果我想 "update" 3,table 看起来像这样:
A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
3 | 2
为此,我使用准备好的语句来获取任何 A 的最大 B 值。
PreparedStatement max = connection.prepareStatement("SELECT max(B) as B FROM Table WHERE A = ?");
max.setInt(1, x);
ResultSet rsMax = max.executeQuery();
if(rsMax.next()) {
/* do stuff */
}
如果 A 值与 x 具有相同的值,则该方法工作得很好。
但是,当 x 是 table 中未包含的值时,例如 10.
我正在使用 H2,当我尝试在 Web 界面中输入与准备好的语句(当然是正确的数字)中的查询相同的查询时,我得到的结果是 null,这就是我如果 table 中没有具有此值的 A 属性,我应该得到。但是,我的程序仍然进入 if 块,我不知道为什么。如果结果集为空,我认为这不应该发生?
我可以尝试从结果集中获取值,但如果我想获取一个整数,我可以理解地得到一个 0。现在我可以通过不让任何 A 条目使用 0 来解决这个问题,但我对此表示怀疑是正确的方法。
如有任何帮助,我们将不胜感激。
首先要提醒一句如果可以有更多的数据库并发连接,请不要使用这种方法。
原因很简单,更多的会话将读取最大值并增加它并插入重复项。另一方面如果每次只有一个连接,这是一种有效的方法。
问题是MAX函数returns总是一条记录,所以测试不是meaninfull。
检查必须检查返回值是 NULL 还是 NOT NULL。为此,定义了 wasNull 方法 - 请参见下面的片段:
if(rs.next()) {
ResultSet idx = rs.getInt(1)
if (rs.wasNull()) { idx = 0;} // no record found - use init value
else {idx =+ 1;} // record found - increase the value
}
我正在尝试使用 JDBC 更新 table。 table 由两个属性组成,A 和 B。主键是 A 和 B 的复合键。它看起来像这样:
A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
现在我希望能够根据我选择的 A 属性向此 table 添加一个新条目。它应该添加另一个,递增 1。例如,如果我想 "update" 3,table 看起来像这样:
A | B
------
1 | 0
2 | 0
3 | 0
3 | 1
3 | 2
为此,我使用准备好的语句来获取任何 A 的最大 B 值。
PreparedStatement max = connection.prepareStatement("SELECT max(B) as B FROM Table WHERE A = ?");
max.setInt(1, x);
ResultSet rsMax = max.executeQuery();
if(rsMax.next()) {
/* do stuff */
}
如果 A 值与 x 具有相同的值,则该方法工作得很好。 但是,当 x 是 table 中未包含的值时,例如 10.
我正在使用 H2,当我尝试在 Web 界面中输入与准备好的语句(当然是正确的数字)中的查询相同的查询时,我得到的结果是 null,这就是我如果 table 中没有具有此值的 A 属性,我应该得到。但是,我的程序仍然进入 if 块,我不知道为什么。如果结果集为空,我认为这不应该发生?
我可以尝试从结果集中获取值,但如果我想获取一个整数,我可以理解地得到一个 0。现在我可以通过不让任何 A 条目使用 0 来解决这个问题,但我对此表示怀疑是正确的方法。
如有任何帮助,我们将不胜感激。
首先要提醒一句如果可以有更多的数据库并发连接,请不要使用这种方法。
原因很简单,更多的会话将读取最大值并增加它并插入重复项。另一方面如果每次只有一个连接,这是一种有效的方法。
问题是MAX函数returns总是一条记录,所以测试不是meaninfull。
检查必须检查返回值是 NULL 还是 NOT NULL。为此,定义了 wasNull 方法 - 请参见下面的片段:
if(rs.next()) {
ResultSet idx = rs.getInt(1)
if (rs.wasNull()) { idx = 0;} // no record found - use init value
else {idx =+ 1;} // record found - increase the value
}