【问题标题】:ODBC Error: Invalid String or Buffer Length--Microsoft Server 2008 32bit vs 2008 R2 64bitODBC 错误:无效的字符串或缓冲区长度--Microsoft Server 2008 32 位与 2008 R2 64 位
【发布时间】:2011-05-28 12:36:30
【问题描述】:

尝试使用 SQL Server Native Client 10.0 通过 ODBC 系统 DSN 从 Java 6 控制台应用程序连接到 Microsoft Windows Server 2008 R2 64 位系统上的 Microsoft SQL Server 2008 R2。以下源代码:

        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] 字符串缓冲区长度无效

令人发指的是,相同的代码,以及以完全相同的方式配置的 ODBC 系统 DSN,WORKS 与 MS Server 2008 32 位(非 R2)和 MS SQL Server 2008 R2。两个系统之间的 Microsoft ODBC 驱动程序 dll 是不同的版本,6.0.xxxx 与 6.1.xxxx,我怀疑这是罪魁祸首。

【问题讨论】:

    标签: java odbc sql-server-2008-r2 windows-server-2008-r2 sql-server-native-client


    【解决方案1】:

    这是一个java bug,至少升级到java 1.7.70。

    【讨论】:

    • 你有这个参考吗? Oracle 网站上记录了此错误的内容?
    • 我没有任何文档。在具有 64 位的 PC 中,对 Access 执行查询,它向我显示了这个错误。只需将 java 1.7.17 升级到 1.7.70 就可以了
    • 我电脑上安装的版本是Java Oracle 1.7.0_17版。没有openjdk版本
    【解决方案2】:

    JDBC-ODBC 桥本机代码问题。 本机代码使用无效的 BufferLength 参数调用 ODBC 函数 SQLGetData。 此问题仅发生在 64 位 jvm 上。据我所知,它可能发生在所有 jdks 上:从 1.0 到 1.7。

    BufferLength 是一个 8 字节的 SQLLEN 参数。高 4 字节在 64 位 jvm 中未初始化,这是根本原因。 目前没有解决方法,Oracle 拒绝修复这个问题,尽管我通过 oracle metalink 网站报告了它。

    【讨论】:

      【解决方案3】:

      是的,ODBC 管理器版本应该是问题所在。以下是我遇到的问题和我想到的解决方案,希望它对其他人也有帮助。

      当尝试从部署到 Jboss 4.x 的应用程序对系统 ODBC DSN(MS Access .mdb 文件)运行查询时,我收到相同的错误:“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 执行,结果是:无效的字符串或缓冲区长度。

      由于我可以读取注册为具有给定 DSN 的 ODBC DS 的 .mdb 文件,并且在从独立应用程序查询时没有收到此错误,因此我将制作一个独立应用程序来读取 .mdb 文件。 mdb 文件,并将其内容写入 .csv 文件,Jboss 应用程序将读取该文件。

      如果有人找到更好的解决方案,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 2010-12-15
        相关资源
        最近更新 更多