2

Firebird の jaybird JDBC ドライバーを使用してバインドnullするときに、まれなケースで少し状況が発生しています。PreparedStatementステートメントの例を次に示します。

Class.forName("org.firebirdsql.jdbc.FBDriver");

// Observe the "local" in the connection string!
Connection con = DriverManager.getConnection(
    "jdbc:firebirdsql:local:C:/data/firebird/test.db", "TEST", "TEST");

// With this connection, I'm not able to reproduce the issue:
Connection con1 = DriverManager.getConnection(
    "jdbc:firebirdsql:localhost:C:/data/firebird/test.db", "TEST", "TEST");

PreparedStatement stmt = con.prepareStatement(
  "SELECT cast(? as varchar(1)) FROM rdb$database");
stmt.setObject(1, null);
ResultSet rs = stmt.executeQuery();
rs.next();
System.out.println(rs.getString(1));
System.out.println(rs.wasNull());

上記のプログラムの出力は、

>
> false

最初の行は空の文字列です。本当はこうあるべき

> null
> true

この行を変更...

stmt.setObject(1, null);

...これらの行のいずれかに...

stmt.setString(1, null);
stmt.setNull(1, Types.VARCHAR);

...どちらも役に立ちません。null回避策は、リテラルをプリペアド ステートメントにバインドするのではなく、SQL ステートメントでインライン化することです。私は何が欠けていますか?

詳細:

  • データベース: Firebird WI-V2.5.1.26351
  • JDBC ドライバー: jaybird-2.2.0
  • Java バージョン: JDK 1.6.0_24
  • OS: Windows7 x64
  • JDBC 接続文字列: 上記を参照してください。
4

2 に答える 2

3

Windows 7 x64上のJaybird 2.2.0およびFirebird 2.1.3 (32 ビット)で問題を再現できません。ソース コードをコピーして貼り付けて実行すると、期待どおりの出力が生成されます。

念のため添付のスクリーンショット:

ここに画像の説明を入力

アップデート

Windows XP上のJaybird 2.2.0およびFirebird 2.5.1 (32 ビット)でテストしましたが、まだ問題を再現できません -> 期待どおりの正確な出力。

于 2012-08-24T15:47:09.527 に答える
1

どうやら、これは JDBC ドライバーのバグです。

http://tracker.firebirdsql.org/browse/JDBC-271

この種類の接続 URL を使用する場合にのみ表示されます。

// Observe the "local" in the connection string!
Connection con = DriverManager.getConnection(
    "jdbc:firebirdsql:local:C:/data/firebird/test.db", "TEST", "TEST");

この並べ替えではありません:

// With this connection, I'm not able to reproduce the issue:
Connection con1 = DriverManager.getConnection(
    "jdbc:firebirdsql:localhost:C:/data/firebird/test.db", "TEST", "TEST");
于 2012-08-25T09:05:29.427 に答える