2 Stimmen

ODBC-Fehler: Ungültige Zeichenfolge oder Pufferlänge - Microsoft Server 2008 32bit vs 2008 R2 64bit

Ich versuche, eine Verbindung von der Java 6-Konsolenanwendung zu Microsoft SQL Server 2008 R2 auf einem Microsoft Windows Server 2008 R2 64bit-System über einen ODBC-System-DSN mit SQL Server Native Client 10.0 herzustellen. Der folgende Quellcode:

        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);
    }

Wirft Fehler

java.sql.exception [Microsoft] [ODBC Driver Manager] ungültige String-Pufferlänge

Verblüffenderweise ist derselbe Code mit einem ODBC-System-DSN auf genau dieselbe Weise konfiguriert, WERKE mit MS Server 2008 32bit (nicht-R2) und MS SQL Server 2008 R2. Die Microsoft ODBC-Treiber dlls zwischen den beiden Systemen sind unterschiedliche Versionen, 6.0.xxxx vs 6.1.xxxx, die ich vermute, ist der Schuldige.

1voto

Oleg Efrem Punkte 31

Ja, die ODBC-Manager-Version sollte das Problem sein. Unten ist das Problem, das ich lief in und die Lösung, die ich dachte an, hoffe, es könnte von Hilfe für jemand anderes zu sein.

Wenn ich versuche, Abfrage gegen System ODBC DSN (MS Access .mdb-Datei) von einer App, die auf Jboss 4.x bereitgestellt wird, auszuführen, erhalte ich den gleichen Fehler: "SQL-Status [S1090]; Fehlercode [0]; [Microsoft][ODBC Driver Manager] Ungültige Zeichenfolge oder Pufferlänge" in Windows Server R2.

Ich habe den gleichen Fehler auf 2 verschiedenen Windows Server R2-Maschinen reproduziert. Auf Windows Server Standard (ich vermute R1) und Windows 7 Professional x64 ist das Problem nicht reproduzierbar.

Darüber hinaus habe ich auf demselben Windows Server R2 dieses Problem nicht, wenn ich versuche, eine direkte Verbindung herzustellen (von einer eigenständigen Anwendung aus). Wenn die Anwendung keine Verbindung herstellt bzw. die Datenquelle nicht erkennt, erhalten Sie eine Fehlermeldung, die besagt, dass es keinen solchen DSN-Namen gibt oder dieser nicht gefunden wurde. Die gleiche Fehlermeldung wird ausgegeben, wenn man versucht, eine leere Abfrage an eine ODBC-Datenquelle (registrierter Datenquellenname - DSN) zu senden. Ich vermute also, dass ODBC eine leere Abfrage erhält, die versucht, gegen den DS auszuführen, und das Ergebnis ist: Ungültige Zeichenfolge oder Pufferlänge.

Da ich die .mdb-Datei lesen kann, die als ODBC DS mit gegebenem DSN registriert ist, und ich diesen Fehler nicht erhalte, wenn ich sie von der eigenständigen Anwendung abfrage, werde ich eine eigenständige Anwendung erstellen, die die .mdb-Datei über ODBC liest und ihren Inhalt in eine .csv-Datei schreibt, die von den Jboss-Anwendungen gelesen wird.

Wenn jemand eine bessere Lösung findet, lassen Sie es mich bitte wissen.

1voto

zhugf000 Punkte 21

Eine Frage des nativen Codes der JDBC-ODBC-Brücke. Die nativen Codes rufen die ODBC-Funktion SQLGetData mit einem ungültigen BufferLength-Parameter auf. Dieses Problem tritt nur auf 64bit JVM auf. So wie ich weiß, kann es auf allen JDBCs auftreten: seit 1.0 bis 1.7.

Die BufferLength ist ein 8-Byte-SQLLEN-Parameter. Die oberen 4 Bytes sind im 64-Bit-JVM nicht initialisiert, was die Ursache ist. Derzeit gibt es keinen Workaround, und Oracle weigert sich, dieses Problem zu beheben, obwohl ich es über die Oracle-Metalink-Website gemeldet habe.

0voto

jvea Punkte 59

Dies ist ein Java-Fehler, aktualisieren Sie mindestens auf Java 1.7.70.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X