Ошибка ODBC: неверная длина строки или буфера - PullRequest
2 голосов
/ 21 декабря 2010

Попытка подключения из консольного приложения 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] недопустимая длина буфера строки

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

Ответы [ 3 ]

1 голос
/ 08 апреля 2014

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

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

1 голос
/ 09 февраля 2011

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

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

Я воспроизвел ту же ошибку на 2 разных компьютерах с 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,

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

0 голосов
/ 11 июня 2014

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

...