2

Java 6 コンソール アプリから Microsoft Windows Server 2008 R2 64 ビット システム上の Microsoft SQL Server 2008 R2 に、SQL Server Native Client 10.0 を使用して ODBC システム DSN 経由で接続しようとしています。以下のソースコード:

        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 で動作します。2 つのシステム間の Microsoft ODBC ドライバー dll は、6.0.xxxx と 6.1.xxxx の異なるバージョンであり、これが原因であると思われます。

4

3 に答える 3

1

ええ、ODBC Manager のバージョンが問題になるはずです。以下は、私が遭遇した問題と私が考えた解決策です。それが他の誰かにも役立つことを願っています.

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 を作成し、その内容を Jboss アプリが読み取る .csv ファイルに書き込みます。

誰かがより良い解決策を見つけたら、私に知らせてください。

于 2011-02-09T12:32:17.160 に答える
1

JDBC-ODBC ブリッジのネイティブ コードの問題。ネイティブ コードは、無効な BufferLength パラメータを指定して ODBC 関数 SQLGetData を呼び出します。この問題は 64 ビット jvm でのみ発生します。私が知っているように、それはすべての jdk で発生する可能性があります: 1.0 から 1.7 まで。

BufferLength は 8 バイトの SQLLEN パラメータです。上位 4 バイトは 64 ビット jvm で初期化されていないままであり、これが根本的な原因です。現在、回避策はなく、オラクル メタリンクの Web サイトで報告したにもかかわらず、オラクルはこの問題の修正を拒否しています。

于 2014-04-08T15:09:23.793 に答える
0

これは Java のバグです。少なくとも Java 1.7.70 にアップグレードしてください。

于 2014-06-11T08:46:57.570 に答える