2014-10-13 6 views
7

Próbuję utworzyć program Java, który uzyskuje dostęp do źródła danych ODBC. Korzystanie poniższy kod ...Tworzenie połączenia z językiem Java ODBC skutkuje wyjątkiem java.sql.SQLException: Niepoprawny typ kursora

Connection conn; 

try { 
    Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 
    DriverManager.registerDriver(d); 
    String URL = "jdbc:odbc:AR System ODBC Data Source"; 
    conn = DriverManager.getConnection(URL); 
} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e) { 
    Logger.error(this, e); 
} 

Statement s = null; 
ResultSet rs = null; 

try { 
    s = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
    rs = s.executeQuery("select count(*) as rows from table"); 

    if (rs.next()) { 
     System.out.print("Count of all rows is " + rs.getInt("rows")); 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
} finally { 
    DBUtils.safelyClose(s, rs); 
} 

... pojawia się następujący wyjątek:

java.sql.SQLException: The result set type is not supported. 
    at sun.jdbc.odbc.JdbcOdbcStatement.initialize(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcConnection.createStatement(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcConnection.createStatement(Unknown Source) 
    at com.csc.remedyarchiver.data.input.ODBCConnection.main(ODBCConnection.java:38) 

Początkowo, kiedy próbuje rozwiązać to na własną rękę, używałem pusty createStatement argumentów(), ale to prowadzi do powyższego wyjątku (dlatego użyłem TYPE_FORWARD_ONLY zestawu wyników, ale wciąż ten sam wynik):

Czy jest coś jeszcze, co mogę spróbować z tym czy to wymaga innego podejścia?

+0

sprawdź, czy zmieniać, czy podczas, gdy dokładnie.nie mówi podczas (rs.next()) { System.out.print ("Liczba wszystkich wierszy wynosi" + rs.getInt ("wiersze")); } –

+0

@PiumiWandana - To nie działało w przypadku wyjątku Invalid Cursor Type. – Ocracoke

+0

Spróbuj dodać parametr 'ResultSet.CLOSE_CURSORS_OVER_COMMIT' w' createStatement() ', aby sprawdzić, czy pomaga –

Odpowiedz

0

"wybierz liczbę (*) jako wiersze z tabeli". Spróbuj najpierw zastąpić alias z "wierszy" do "Wynik" lub coś podobnego. Wiersze to jedno z zastrzeżonych słów kluczowych w Oracle. Nie sądzę, że select zwraca jakiś wynik oprócz błędu ora 00923

+0

Kod nie osiąga tak daleko, jak nie inicjalizuje obiektu instrukcji. Niemniej jednak należy o tym pamiętać. – Ocracoke

0

Czy warto wypróbować następujące rzeczy, po pierwsze, aby potwierdzić, że nie jest obsługiwana, a następnie ponownie z różnych typów Resultset, aby znaleźć taki, który jest?

System.out.println(conn.getMetaData().supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY)); 
+0

Dla wszystkich trzech typów Resultset, które ma Java 1.7, wszystkie zwracają fałsz. – Ocracoke

+0

Jeśli zwrócą fałsz, to nigdy nie zadziała dla ciebie. Być może problem ze sterownikiem ODBC, którego używasz? Ten facet wydaje się mieć ten sam problem i pracował nad nim przy użyciu innego sterownika JDBC. http://www.mirthcorp.com/community/forums/archive/index.php/t-3966.html –

1

Z dokumentacji Oracle do pobierania zbiorów danych:

Uwaga: Nie wszystkie sterowniki JDBC bazy danych i obsługują wszystkie typy ResultSet. Metoda DatabaseMetaData.supportsResultSetType zwraca wartość true, jeśli określony typ ResultSet jest obsługiwany i wartość false w przeciwnym razie.

https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

Więc na początek, może chcesz sprawdzić, czy połączenie obsługuje wynik ustawia próbujesz użyć.

connection.getMetaData().supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY) 
connection.getMetaData().supportsResultSetType(ResultSet.CONCUR_READ_ONLY) 

Powyższe metody zwracają wartość true dla mojej konfiguracji. Z tego powodu opublikowany przez ciebie kod działa w moim środowisku. Założę się, że jeden z nich (lub oba) zwróci false dla ciebie i domyślam się, że jest to problem z samą bazą danych lub wersją sterownika JDBC Oracle, którego używasz. Możesz mieć pewność, że używasz najnowszego sterownika OJDBC którego można dostać się stąd:

http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

Jeśli upewnieniu się, że używasz najnowszej wersji sterownika, chciałbym sprawdzić wersję Database jesteś używając i zestawów wyników obsługiwanych przez niego.

Powiązane problemy