Ошибка ODBC: недопустимая строка или длина буфера - 32-разрядная версия Microsoft Server 2008 против 64-разрядной версии 2008 R2

Попытка подключиться из консольного приложения Java 6 к Microsoft SQL Server 2008 R2 в 64-битной системе Microsoft Windows Server 2008 R2 через системный DSN ODBC с использованием SQL Server Native Client 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] недопустимая длина строкового буфера.

Ужасно, но тот же код с DSN системы ODBC, настроенным точно так же, РАБОТАЕТ с 32-битным MS Server 2008 (не R2) и MS SQL Server 2008 R2. DLL-файлы драйвера Microsoft ODBC между двумя системами имеют разные версии, 6.0.xxxx и 6.1.xxxx, что, как я подозреваю, является виновником.




Ответы (3)


Да, проблема должна быть в версии ODBC Manager. Ниже представлена ​​проблема, с которой я столкнулся, и решение, которое я придумал, надеюсь, это может быть полезно и кому-то другому.

При попытке выполнить запрос к системному ODBC DSN (файл MS Access .mdb) из приложения, развернутого на Jboss 4.x, я получаю ту же ошибку: «Состояние SQL [S1090]; код ошибки [0]; [Microsoft] [Драйвер ODBC Manager] Недопустимая строка или длина буфера "в Windows Server R2.

Я воспроизвел ту же ошибку на двух разных машинах с Windows Server R2. В Windows Server Standard (я полагаю, R1) и Windows 7 Professional x64 проблема не воспроизводится.

Более того, на том же Windows Server R2 при попытке подключиться напрямую (из автономного приложения) у меня не возникает этой проблемы. Если приложение не подключится / не обнаружит источник данных, вы получите сообщение об ошибке, в котором говорится, что такого имени DSN нет или он не найден. Такое же сообщение об ошибке выдается при попытке отправить пустой запрос к источнику данных ODBC (зарегистрированное имя источника данных - DSN). Итак, я предполагаю, что ODBC получает пустой запрос, который пытается выполнить против DS, и результат: Недопустимая строка или длина буфера.

Поскольку я могу читать файл .mdb, зарегистрированный как ODBC DS с заданным DSN, и я не получаю эту ошибку при запросе его из автономного приложения, я собираюсь создать автономное приложение, которое будет читать файл .mdb через ODBC и запишите его содержимое в файл .csv, который будут читать приложения Jboss.

Если кто-нибудь найдет лучшее решение, дайте мне знать.

person Oleg Efrem    schedule 09.02.2011

Проблема с собственными кодами моста JDBC-ODBC. Собственные коды вызывают функцию ODBC SQLGetData с недопустимым параметром BufferLength. Эта проблема возникает только на 64-битном jvm. Насколько я знаю, это может происходить на всех jdks: с 1.0 до 1.7.

BufferLength - это 8-байтовый параметр SQLLEN. Старшие 4 байта остаются неинициализированными в 64-битном jvm, что является основной причиной. В настоящее время обходного пути нет, и Oracle отказывается исправлять эту проблему, хотя я сообщил об этом через веб-сайт oracle metalink.

person zhugf000    schedule 08.04.2014

это ошибка Java, обновите по крайней мере до Java 1.7.70.

person jvea    schedule 11.06.2014
comment
У вас есть ссылка на это? Что-нибудь на веб-сайте Oracle, где задокументирована эта ошибка? - person S.L. Barth; 11.06.2014
comment
У меня нет документации. В ПК с 64-битным запросом выполните снова Access, и он покажет мне эту ошибку. Обновите только java 1.7.17 до 1.7.70, и это работает - person jvea; 11.06.2014
comment
На моем компьютере установлена ​​версия Java Oracle 1.7.0_17. Нет версии openjdk - person jvea; 20.03.2015