JDBC:空/空结果集?

Posted

技术标签:

【中文标题】JDBC:空/空结果集?【英文标题】:JDBC: empty/null result set? 【发布时间】:2016-03-23 15:02:54 【问题描述】:

我正在尝试使用 JDBC 来更新表。该表由 A 和 B 两个属性组成。主键是 A 和 B 的组合键。它看起来像这样:

A | B
------
1 | 0
2 | 0
3 | 0
3 | 1

现在我希望能够根据我选择的 A 属性向该表中添加一个新条目。它应该添加另一个,将其增加 1。例如,如果我想“更新”3,表格将如下所示:

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 */
            

如果有一个与 x 具有相同值的 A 值,这将非常有效。 但是,当 x 是表中未包含的值(例如 10)时,我会遇到异常情况。

我正在使用 H2,当我尝试在 Web 界面中输入与准备好的语句中的查询相同的查询(当然是正确的数字)时,结果我得到 null,这就是我应该做的获取表中是否没有具有此值的 A 属性。但是,我的程序仍然进入 if 块,我不知道为什么。如果结果集为空,我认为这不应该发生?

我可以尝试从结果集中获取值,但是如果我想获得一个整数,我可以理解地得到一个 0。现在我可以通过没有任何使用 0 的 A 条目来解决这个问题,但我怀疑这是这样做的正确方法。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

首先警告一下如果有更多的并发连接到数据库,请不要使用这种方法

原因很简单,更多的会话会读取最大值并增加它并插入重复项。另一方面,如果每次只有一个连接,这是一种有效的方法

问题是MAX函数总是返回一条记录,所以测试没有意义。

检查必须检查返回的值是 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:空/空结果集?的主要内容,如果未能解决你的问题,请参考以下文章

空结果集,使用 JDBC 和 MSSQL

对空结果集的非法操作 - 如何检查它是不是为空? [复制]

Doctrine 存储库返回空结果集

我无法捕获 FMDB 空结果集

PHP PDO ODBC 意外的空结果集

SPARQL 查询返回空结果集