Я сталкиваюсь с небольшой ситуацией в крайних случаях при привязке null
к PreparedStatement
с помощью JDBC-драйвера Firebird jaybird. Вот пример заявления:
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
- ОС: Windows 7 x64
- Строка подключения JDBC: см. выше.
rdb$get_context('SYSTEM', 'ENGINE_VERSION')
возвращает 2.5.1. Остальная информация добавлена в вопрос - person Lukas Eder   schedule 25.08.2012DatabaseMetaData.getDatabaseProductVersion()
должен вернуть полную версию - person Mark Rotteveel   schedule 25.08.2012