在使用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);
......也没有帮助。解决方法是在SQL语句中内联null
文字,而不是将它们绑定到预准备语句。我错过了什么?
详细信息:
答案 0 :(得分:3)
我无法在 Windows 7 x64 上的 Jaybird 2.2.0 和 Firebird 2.1.3(32位)上重现该问题。 复制粘贴源代码并运行它会产生完全预期的输出。
屏幕截图,以防万一:
<强>更新强>
在 Jaybird 2.2.0上测试&amp; Windows XP 上的 Firebird 2.5.1(32位),仍然无法重现问题 - &gt;与预期完全相同的输出。
答案 1 :(得分:1)
显然,这是JDBC驱动程序中的一个错误:
http://tracker.firebirdsql.org/browse/JDBC-271
仅在使用此类连接网址时出现:
// 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");