在光标位于插入行的ResultSet#next中会发生什么?

时间:2011-02-02 12:40:19

标签: java jdbc resultset

我在这里有点不知所措。我应该为特定目的编写javax.sql.RowSet的实现,并且我尽可能地对它进行单元测试。

现在,ResultSet的光标可以在正常行上(或在第一行之前或之后)或插入行上。 moveToInsertRow()说:

  

当光标位于插入行上时,只能调用updater,getter和insertRow方法。

当然应该发生什么事情。 next()甚至没有指出这种情况,因此不太有帮助:

  

将光标从当前位置向前移动(sic!)一行。 ResultSet光标最初位于第一行之前;对方法的第一次调用使得第一行成为当前行;第二个调用使第二行成为当前行,依此类推。

     

当对下一个方法的调用返回false时,光标位于最后一行之后。任何需要当前行的ResultSet方法的调用都将导致SQLException被抛出。如果结果集类型为TYPE_FORWARD_ONLY,则由供应商指定其JDBC驱动程序实现是返回false还是在SQLException的后续调用中抛出next

     

如果输入流为当前行打开,则对方法next的调用将隐式关闭它。读取新行时,将清除ResultSet对象的警告链。

     

返回:
  true如果新的当前行有效;如果没有更多行,则false

     

抛出:
  SQLException - 如果发生数据库访问错误或在关闭的结果集上调用此方法

我之前没有使用JDBC API的经验,因此不知道是否故意未指定(未定义的行为可能?)或只是疏忽。

目前我认为我只是抛出一个SQLException即使没有指定,因此UnsupportedOperationException可能会更好(因为SQLException表示数据库错误或已关闭{{1} - 这两种情况都不是这样的。)

或者我在某处错过了一些文档?

2 个答案:

答案 0 :(得分:1)

我建议您遵循moveToInsertRow()的合同并抛出某种异常(SQL-IllegalState-)。如果人们错误地拨打next(),这将导致最小的麻烦。

您还可以查看其他人的实现,看看他们做了什么(例如MySQL Connector / J),这样您使用的其他框架就不会感到惊讶。

答案 1 :(得分:1)

next()之后编写一个小程序来实际测试moveToInsertRow()的行为怎么样?

我是TDDer但有时当我编写使用“外来”API的东西时,我会创建一个小概念证明,它不是真正的测试驱动,通常称为“尖峰”,这样我就可以学习不同的API调用如何交互。 当我觉得自己已经很好地掌握了API时,我就会把尖峰扔掉,然后以正常的TDD方式开始编码。