2

absolute(int row) Java Docは次のように述べています。

この ResultSet オブジェクト内の指定された行番号にカーソルを移動します。行番号が正の場合、カーソルは結果セットの先頭から指定された行番号に移動します。最初の行は行 1、2 番目の行は行 2 などです。

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

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

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

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

0メソッドに渡すときは、最初の行の直前にカーソルabsolute(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.");
        }

そのように振る舞う理由はありますか?

前もって感謝します!

4

1 に答える 1

2

Javadoc を考えると、これは Jaybird のバグです。Jaybird 2.2.12 (および 3.0.0) でこれを修正するためにJDBC-453を作成しました。これがこのように実装された理由を見つけるために、いくつかの考古学を行いました。

歴史的に、呼び出しabsolute(0)は JDBC 2 / Java 1.3 (およびそれ以前) では許可されていませんでした。ResultSet.absoluteJava 1.3.1の javadoc には次のように書かれています (強調は私のものです):

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

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

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

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

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

戻り値:
  カーソルが結果セット上にある場合は true。それ以外の場合は false
スロー:
  SQLException - データベース アクセス エラーが発生した場合、行が0、または結果セットのタイプがTYPE_FORWARD_ONLY

つまり0、パラメーター値としての使用は許可されていませんでした。ただし、同じエントリで、「結果セットの最初/最後の行を超えてカーソルを配置しようとすると、カーソルは最初の行の前または最後の行の後に残ります。」許可されるべきだったことを示唆しています。

JDBC 3 / Java 1.4.2 (および Java 5) の場合、これは次のように変更されました。

例外: SQLException - データベース アクセス エラーが発生した場合、または結果セットのタイプがTYPE_FORWARD_ONLY

強調表示した文 ( 「指定された行番号がゼロの場合、カーソルは最初の行の前に移動します。」 ) は、さらに明確にするために JDBC 4.1 (Java 7) でのみ追加されました。

しかし、 の改訂履歴を見るとFBCachedFetcher、この制限は、Java 1.4.2 がしばらく前から利用可能になっていた 2004 年 7 月に追加されました (そして Java 5 の準備がほぼ整いました)。当時私はまだプロジェクトに参加していませんでしたが、唯一の理由は、コードが JDBC 2 TCK (Technology Compatibility Kit) でテストされたということです。これは公開された最後のものであり、これが次のように変更されました。 TCK によって報告された問題に対処します。

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

于 2016-09-11T08:01:10.380 に答える