2016-09-10 3 views
2

absolute(int row)Java Docは言う:このResultSetオブジェクト内の指定された行番号にカーソルを移動Jaybird(FirebirdのJDBC)絶対()メソッド

を。行番号が正の場合、 カーソルは、結果セットの の先頭に対して、指定された行番号に移動します。最初の行は1行目、2行目は2行目なので がオンになります。

指定された行番号が負の場合、カーソルは結果セットの末尾に対して絶対 の行位置に移動します。たとえば、 メソッドabsolute(-1)を呼び出すと、最後の行にカーソルが移動します。 メソッドabsolute(-2)を呼び出すと、最後の次の 行にカーソルが移動します。

指定された行番号がゼロの場合、カーソルは の最初の行の前に移動されます。

結果セットの最初/最後の行を超えてカーソルを置くと、最初の行の前または最後の 行の後にカーソルが残ります。

注:absolute(1)を呼び出すことは、first()を呼び出すことと同じです。 を絶対(-1)と呼び出すことは、last()を呼び出すことと同じです。 0absolute(int row)の方法を渡すことbeforeFirst()がちょうど最初の行の前にカーソルを配置するように振る舞うべき

しかし、私はこの例外を持ってJaybirdを使用して:

Exception in thread "main" org.firebirdsql.jdbc.FBSQLException: You cannot position to the row 0 with absolute() method. 
    at org.firebirdsql.jdbc.FBCachedFetcher.absolute(FBCachedFetcher.java:243) 
    at org.firebirdsql.jdbc.FBCachedFetcher.absolute(FBCachedFetcher.java:232) 
    at org.firebirdsql.jdbc.AbstractResultSet.absolute(AbstractResultSet.java:1371) 
    at chapterA.ResultSets.main(ResultSets.java:180) 

はJaybirdソース(FBCachedFetcher.java)で検索私は、行のパラメータが0であるとき、それは例外をスローすることがわかった:

private boolean absolute(int row, boolean internal) throws SQLException { 
     checkScrollable(); 

     if (row < 0) { 
      row = rows.size() + row + 1; 
     } 

     if (row == 0 && !internal) { 
      throw new SQLException("You cannot position to row 0 with absolute() method."); 
     } 

は、任意のはありますそれのような行動の理由?

ありがとうございます!

答えて

1

Javadocを指定すると、これはJaybirdのバグです。私はこれをJaybird 2.2.12(および3.0.0)で修正するためにJDBC-453を作成しました。私はこれがなぜこのように実装されたのかを知るためにいくつかの考古学を行った。

従来は、JDBC 2/Java 1.3(およびそれ以前)ではabsolute(0)を呼び出すことはできませんでした。

このResultSetオブジェクト内の指定された行番号にカーソルを移動します。

行番号が正の場合、カーソルは結果セットの先頭に対して指定された行番号に移動します。最初の行は行1で、2番目の行は2番目の行であり、以下同様です。

指定された行番号が負の場合、カーソルは結果セットの最後に対して絶対行の位置に移動します。たとえば、メソッドabsolute(-1)を呼び出すと、最後の行にカーソルが移動します。メソッドabsolute(-2)を呼び出すと、最後の行の次の行にカーソルが移動します。

カーソルを結果セットの最初/最後の行を超えて配置しようとすると、最初の行の前または最後の行の後にカーソルが残ります。

注:absolute(1)を呼び出すことは、first()を呼び出すことと同じです。 absolute(-1)を呼び出すことはlast()を呼び出すことと同じです。

戻り値:
   カーソルが結果セットである場合はtrue;そうでない場合はfalse
例外:
    SQLException - データベースアクセスエラーが発生した場合、行が0ある、または結果セットの型がパラメータ値として0を用いすなわちTYPE_FORWARD_ONLY

あります許可されませんでした。しかし、同じエントリでは、文"結果セットの最初/最後の行を超えてカーソルを配置しようとすると、最初の行の前または最後の行の後にカーソルが残ります。は、許可されている必要があることを示唆しています。

例外:

はJDBC 3 /ジャワ1.4.2(およびJava 5)の場合、これは、に変更した SQLException - データベースアクセスエラーが発生した場合、または結果セットの型は、TYPE_FORWARD_ONLY

ある場合

あなたが強調表示された文(「指定された行の数がゼロの場合、カーソルが最初の行の前に移動させる。」は)のみをさらに明確化のためにJDBC 4.1(ジャワ7)に添加しました。

FBCachedFetcherの改訂履歴を見ると、2004年7月にこの制限が追加されました。Java 1.4.2がすでに使用可能になっていて、Java 5がほとんど準備されていました。私はその時点でまだプロジェクトに参加していませんでしたが、私が考えることができる唯一の理由は、コードがJDBC 2 TCK(Technology Compatibility Kit)で公開された最後のものとしてテストされたことですTCKによって報告された問題を解決する。

開示:私はJaybird/Firebird JDBCドライバの開発者です。