2

尝试使用 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,适用MS Server 2008 32 位(非 R2)和 MS SQL Server 2008 R2。两个系统之间的 Microsoft ODBC 驱动程序 dll 是不同的版本,6.0.xxxx 与 6.1.xxxx,我怀疑这是罪魁祸首。

4

3 回答 3

1

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

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

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

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

于 2011-02-09T12:32:17.160 回答
1

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

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

于 2014-04-08T15:09:23.793 回答
0

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

于 2014-06-11T08:46:57.570 回答