2011-02-02 83 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方式進行編碼。

相關問題