Я только что проверил это и для поля OLE Object
(LONGBINARY
) в базе данных Access 2010 я обнаружил, что все пять из этих вариантов позволяют мне указывать нулевое значение в качестве параметра для PreparedStatement с использованием ванильного JDBC / ODBCDriver={Microsoft Access Driver (*.mdb, *.accdb)}
:
s.setNull(4, java.sql.Types.LONGNVARCHAR);
s.setNull(4, java.sql.Types.LONGVARCHAR);
s.setNull(4, java.sql.Types.NCHAR);
s.setNull(4, java.sql.Types.NVARCHAR);
s.setNull(4, java.sql.Types.VARCHAR);
Особенно интересно, что
s.setNull(4, java.sql.Types.LONGVARBINARY);
работает не , учитывая, что при извлечении OLE Object
из базы данных Access java.sql.Types.LONGVARBINARY
в соответствии с ResultSetMetaData
объектом:
String SQL;
SQL = "SELECT Photo FROM City WHERE City_ID = 12";
s = conn.createStatement();
s.executeQuery(SQL);
ResultSet rs = s.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
String accessTypeName = rsmd.getColumnTypeName(1);
int javaType = rsmd.getColumnType(1);
String javaTypeName = (
javaType == java.sql.Types.LONGVARBINARY
? "java.sql.Types.LONGVARBINARY"
: "some other Type"
);
System.out.println(String.format("The database-specific type name for this column is '%s'", accessTypeName));
System.out.println(String.format("The SQL type for this column is: %d (%s)", javaType, javaTypeName));
, который возвращает:
The database-specific type name for this column is 'LONGBINARY'
The SQL type for this column is: -4 (java.sql.Types.LONGVARBINARY)
Статья в Википедии о ODBC включает history , свидетельствующая о том, что после того, как более ранние усилия ("SQL / CLI") стали частью стандарта ISO SQL, Microsoft по сути разветвила свою собственную версию и в конце концов предложила ODBC.Если это так, то ранние попытки соответствовать «стандарту ODBC», возможно, столкнулись с теми же трудностями, что и попытки соответствовать «стандарту» документа RTF от Microsoft: «стандартом» было то, что Microsoft реализовала и подчиняласьизменить по собственному усмотрению Microsoft.
Однако в официальном документе Microsoft ODBC 1995 года, доступном по ссылке для скачивания здесь , последовательно указывается тип данных "OLE Object" как отображение на "* BINARY" или«необработанные» типы (или, в случае с SQL Server, к устаревшему типу данных IMAGE).Таким образом, несоответствие CHAR / BINARY, похоже, не является случаем некоторой ранней причуды ODBC, которая только что увековечилась.
Конечно, эта загадка не нова.В ветке форума здесь от ~ 11 лет назад предполагается, что эта проблема возникла, когда что-то изменилось после выпуска JDK 1.4.
И, наконец, Oracle заявила, что мост JDBC-ODBC "будетудалено в JDK 8 "(ссылка: здесь ).Так что, если не было «официального» объяснения (или исправления, в этом отношении), становится все менее вероятным, что какое-либо будет предстоящее.