Ошибка 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.

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

Это ошибка Java, обновите до версии Java 1.7.70 как минимум.

Другие вопросы по тегам