2013-02-14 8 views
7

Debuggen ich dieses Stück Code verwenden, um einige Daten in der Datenbank einfügen:vorbereitete Anweisung wirft einzige Ausnahme, wenn nicht

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
Connection con=DriverManager.getConnection("jdbc:odbc:war_odbc"); 
PreparedStatement st = 
    con.prepareStatement(
     "INSERT INTO Actors(FirstName,LastName,Age) VALUES(?,?,?)"); 
st.setString(1, "Robert"); 
st.setString(2, "de Niro"); 
st.setInt(3,45); 
st.executeUpdate();  
con.close(); 

Wenn ich Debugger und Schritt eine Zeile zu einer Zeit, alles gut geht. Wenn ich es nicht verwenden und nur die Anwendung ausführen, bekomme ich diese Ausnahme:

[Microsoft][ODBC Driver Manager] Invalid string or buffer length 
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcConnection.buildTypeInfo(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 

Ich verwende Windows 7 64 Bit. Ich ging zu Verwaltungstools, Datenquellen (ODBC) und ich habe es erfolgreich getestet.

+0

Seit wann ist 'de Niro' eine ganze Zahl? –

+3

Die wahre Frage ist: "Warum funktioniert dieser Code im Debug-Modus?" ... – Aubin

+3

De Niro De Niro, kann er sein, was auch immer er mag – lifetimes

Antwort

0

Die beste Lösung ist die Verwendung dieser Klasse aus sun Paket (Why Developers Should Not Write Programs That Call 'sun' Packages) zu stoppen. Auch dieser Treiber ist wirklich alt, es ist ein Typ-1-Treiber, der JDBC-Aufrufe in ODBC-Aufrufe konvertiert.

Jetzt haben fast alle DB-Anbieter Typ 4-Treiber implementiert. Diese Treiberimplementierung konvertiert JDBC-Aufrufe direkt in ein herstellerspezifisches Datenbankprotokoll.

Auch nach dieser documentation diese Brücke wird in JDK8 entfernt werden, so ist es eine schlechte Idee, es zu verwenden, wenn Sie eine tragbare/anpassungsfähige Lösung wollen.

+1

Danke für Ihren Rat. Ich habe sqljdbc4.jar von microsoft.com installiert, aber es wird mir schwer gefallen, es zum Laufen zu bringen. Ich werde eine andere Frage bezüglich des neuen Problems stellen. Danke noch einmal. –

0

ersetzen st.setInt(2, "de Niro"); mit st.setString(2, "de Niro");

+0

Das ist ein Problem, aber nach dem Stacktrace tritt der Fehler bereits auf 'DriverManager.getConnection()' –

+0

Das Problem tritt während der Vorbereitung der SQL-Anweisung. Es wird nur im Call-Stack nach oben propagiert. –

+0

@Kata Der Fehler tritt vor der Anweisungsvorbereitung in 'DriverManager.getConnection()' auf, der Stacktrace ist ziemlich klar. –

0

Nur wenige Punkte in Bezug auf den Code-Schnipsel zur Verfügung gestellt.

  1. st.setInt (2, "de Niro");
    Hier legen Sie "Zeichenfolge" als zweiten Parameter der Abfrage, aber Sie haben setInt() -Methode verwendet und das ist falsch.

  2. Ist etwas mit Ihrem Betriebssystem verbunden. Ich meine, verwenden Sie 64-Bit-Witwen OS und 32-Bit-Anschluss. Ich bin mir aber nicht sicher.

Überprüfen Sie diesen Link. "[Microsoft][ODBC Driver Manager] Invalid string or buffer length" error

Verwandte Themen