Ошибка ODBC: недопустимая длина строки или буфера -Microsoft Server 2008, 32 бита, по сравнению с 2008 R2, 64 бита
Попытка подключения из консольного приложения Java 6 к Microsoft SQL Server 2008 R2 в 64-разрядной системе Microsoft Windows Server 2008 R2 через системный DSN ODBC с использованием собственного клиента SQL Server 10.0. Следующий исходный код:
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String srcURL = "jdbc:odbc:FOO";
if (dbc == null)
{
dbc = DriverManager.getConnection(srcURL);
dbc.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
else
{
dbc.close();
dbc = DriverManager.getConnection(srcURL);
dbc.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
}
}
catch (ClassNotFoundException cx)
{
System.out.println("class not found");
}
catch (SQLException sx)
{
System.out.println("SQL Exception: " + sx);
log.info("SQL Exception: " + sx);
}
Выдает ошибку
java.sql.exception [Microsoft] [ODBC Driver Manager] недопустимая длина буфера строки
К сожалению, один и тот же код с системным DSN ODBC, настроенным точно так же, РАБОТАЕТ с 32-разрядным MS Server 2008 (не R2) и MS SQL Server 2008 R2. Драйверы Microsoft ODBC между двумя системами имеют разные версии, 6.0.xxxx против 6.1.xxxx, и я подозреваю, что виновником является.
3 ответа
Проблема собственных кодов моста JDBC-ODBC. Собственные коды вызывают функцию ODBC SQLGetData с недопустимым параметром BufferLength. Эта проблема возникает только на 64-битной jvm. Как я знаю, это может произойти на всех jdks: с 1.0 до 1.7.
BufferLength - это 8-байтовый параметр SQLLEN. Старшие 4 байта остаются неинициализированными в 64-битной jvm, что является основной причиной. В настоящее время нет обходного пути, и Oracle отказывается исправить эту проблему, хотя я сообщил об этом на веб-сайте oracle metalink.
Да, в версии ODBC Manager должна быть проблема. Ниже приведена проблема, с которой я столкнулся, и решение, о котором я подумал, надеюсь, что оно может помочь кому-то еще.
При попытке выполнить запрос к системному ODBC DSN (файл MS Access .mdb) из приложения, развернутого в Jboss 4.x, я получаю ту же ошибку: "Состояние SQL [S1090]; код ошибки [0]; [Microsoft][Драйвер ODBC" Manager] "Недопустимая длина строки или буфера" в Windows Server R2.
Я воспроизвел ту же ошибку на 2 разных машинах Windows Server R2. На Windows Server Standard (я думаю R1) и Windows 7 Professional x64 проблема не воспроизводима.
Более того, на той же Windows Server R2 при попытке подключиться напрямую (из автономного приложения) я не вижу этой проблемы. Если приложение не подключится / не обнаружит источник данных, вы получите сообщение об ошибке, в котором говорится, что такого имени DSN нет или оно не найдено. Такое же сообщение об ошибке выдается при попытке отправить пустой запрос к источнику данных ODBC (зарегистрированное имя источника данных - DSN). Поэтому я думаю, что ODBC получает пустой запрос, который пытается выполнить против DS, и в результате получается: Неверная длина строки или буфера.
Поскольку я могу прочитать файл.mdb, зарегистрированный как DS ODBC с данным DSN, и не получаю эту ошибку при запросе его из автономного приложения, я собираюсь создать отдельное приложение, которое будет читать файл.mdb через ODBC и запишите его содержимое в файл.csv, который будут читать приложения Jboss.
Если кто-нибудь найдет лучшее решение, пожалуйста, дайте мне знать.