barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 23 сентября 2011 г.

Transbase ODBC Driver и ошибка при извлечении NUMERIC данных с помощью JDBC-ODBC моста методом getObject

Проблема: 
При попытке извлечь данные из ячейки столбца, имеющего тип "NUMERIC" с помощью метода getObject объекта ResultSet (или просто при попытке просмотра данных в таблице БД Transbase с помощью вкладки "Services" в Netbeans, который видимо тоже при извлечении данных пользуется методом ResultSet.getObject) вылетает исключение вида:

java.sql.SQLException: [Transaction][ODBC Transbase Driver][TEST_DB] unknown: FieldId=5 ???

В логах ODBC-драйвера трансбэйза та же ошибка, однако причина её всё равно не очевидна:


[ODBC Transbase Driver][E:\utmp\seibt\tbodbc3x\trunk\api\sqlcolattribute.c][SQLColAttribute][419]unknown: FieldId=5 ???
[ODBC Transbase Driver][E:\utmp\seibt\tbodbc3x\trunk\api\sqlcolattribute.c][SQLColAttribute][431]Stmt=$0075F200 / Col=27 / FieldId=5 [SQL_DESC_???] <- 0 (len:0 / max: 0)

Решение:
Если тип столбца - "NUMERIC", для извлечения данных использовать метод getFloat вместо универсального getObject (в примере ниже resMD - объект типа ResultSetMetaData, полученный вызовом sourceDataRS.getMetaData(), а sourceDataRS - собственно ResultSet, из которого получаются данные):

 if(resMD.getColumnType(i)==Types.NUMERIC)
row[i] = sourceDataRS.getFloat(i);
else
row[i] = sourceDataRS.getObject(i);

Комментариев нет:

Отправить комментарий