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 接続文字列: 上記を参照してください。