2011-02-02 56 views
1

我在这里有点茫然。我应该为特定目的编写一个javax.sql.RowSet的实现,我正在尽可能地对它进行单元测试。插入行上的游标会在ResultSet#next中发生什么?

现在,ResultSet的游标可以位于普通行上(或在第一行之后或最后一行之前)或插入行中。 moveToInsertRow()说:

只有更新,吸气,当光标位于插入行insertRow方法可以被调用。

什么是应该发生什么,然后说。 next()没有什么帮助甚至没有指出这种情况:

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

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

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

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

抛出:
SQLException - 如果发生数据库访问错误,或者该方法被调用关闭的结果集

我与JDBC API的没有任何经验因此不知道这是否是故意不明确的(未定义的行为可能?)或仅仅是疏忽。

目前我觉得我只是抛出一个SQLException尽管这一直无处规定,因此也许UnsupportedOperationException会更好(如SQLException预示着DB错误或关闭ResultSet - 这两者都不是这里的情况)。

还是我在某处错过了一些文档?

+0

自我相同的文件使我的头脑旋转。假设你加载100行。 1)如果你在结果集上调用next(),他们在说什么'输入流'时说什么? 2)你可以在同一个ResultSet上再次调用absolute(-1)而不会发生SQLException吗? 3)这个“警告链”是什么? – JGFMK 2011-02-21 06:52:26

+0

@JGFMK:1.输入流是一个`InputStream`对象,其中一个`update * Stream`方法被传入,它仍然可以打开。 2.`绝对(-1)`听起来很奇怪,现在我没有文档,但我认为这应该是一个错误,因为没有“减第一”行。 3.警告链收集数据库在调用各种方法时遇到的警告。它在我的实现中未被使用(因为CSV文件不会创建警告),所以我不在乎太多。你应该能够最终弄清楚,但是`RowSet`的200多种方法并不容易。 – Joey 2011-02-21 08:19:36

回答

1

我建议你遵循合同moveToInsertRow()并抛出某种例外(SQL-IllegalState-)。如果人们错误地拨打next(),这将会造成最小的麻烦。

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

1

只需编写一个小程序来实际测试next()moveToInsertRow()之后的行为如何?

我是TDDer,但有时当我编程使用“外部”API的东西时,我会创建一个小测试概念,它不是真正的测试驱动,通常称为“秒杀”,这样我就可以了解不同的API调用如何交互。 当我觉得自己对API有很好的掌握时,我只是抛开尖峰并开始以正常的TDD方式进行编码。