2013-02-14 9 views
7

Używam tego fragmentu kodu, aby wstawić niektóre dane do bazy danych:Sporządzone sprawozdanie rzuca tylko wyjątek, gdy nie debugowania

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

Jeśli użyć debuggera i krok jeden wiersz na raz, wszystko idzie dobrze. Jeśli go nie używam i po prostu uruchomię aplikację, otrzymuję następujący wyjątek:

[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) 

Używam systemu Windows 7 w wersji 64-bitowej. Poszedłem do Narzędzia administracyjne, źródła danych (ODBC) i pomyślnie je przetestowałem.

+0

Od kiedy to "de Niro" jest liczbą całkowitą? –

+3

Prawdziwe pytanie brzmi: "Dlaczego ten kod działa w trybie debugowania?" ... – Aubin

+3

De Niro's De Niro, może być tym, co lubi – lifetimes

Odpowiedz

0

Najlepszym rozwiązaniem jest zaprzestanie korzystania z tej klasy z pakietu sun (Why Developers Should Not Write Programs That Call 'sun' Packages). Również ten sterownik jest naprawdę stary, jest to sterownik typu 1, który konwertuje połączenia JDBC w połączeniach ODBC.

Teraz prawie wszyscy dostawcy DB wdrożyli sterownik typu 4. Ta implementacja sterownika konwertuje wywołania JDBC bezpośrednio do specyficznego dla dostawcy protokołu bazy danych.

Również według tego documentation ten most zostanie usunięty w JDK8, więc nie jest dobrym pomysłem, aby go użyć, jeśli chcesz mieć przenośne/adaptowalne rozwiązanie.

+1

Dzięki za porady. Zainstalowałem program sqljdbc4.jar z witryny microsoft.com, ale staram się sprawić, by działało. Zadam kolejne pytanie dotyczące nowej kwestii. Dzięki jeszcze raz. –

0

Wymień st.setInt(2, "de Niro"); z st.setString(2, "de Niro");

+0

To jest problem, ale zgodnie ze stosu błędów błąd już występuje w 'DriverManager.getConnection()' –

+0

Problem występuje podczas przygotowywania instrukcji SQL. Jest on propagowany w górę w stosie wywołań. –

+0

@Kata Błąd występuje przed przygotowaniem instrukcji, wewnątrz 'DriverManager.getConnection()', stacktrace jest całkiem jasne. –

0

Tylko kilka punktów dotyczących fragment podany.

  1. st.setInt (2, "de Niro");
    Tutaj ustawiasz "ciąg" jako drugi parametr zapytania, ale użyłeś metody setInt() i to jest niepoprawne.

  2. Czy coś jest związane z systemem operacyjnym. mam na myśli, że używasz 64-bitowego systemu operacyjnego i 32-bitowego złącza. nie jestem tego jednak pewien.

Sprawdź ten link. "[Microsoft][ODBC Driver Manager] Invalid string or buffer length" error

Powiązane problemy