2014-10-13 4 views
7

Sto tentando di creare un programma Java che accede a un'origine dati ODBC. Utilizzando il seguente codice ...Creazione di una connessione con risultati ODBC Java in java.sql.SQLException: eccezione di tipo di cursore non valida

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

... ottengo la seguente eccezione:

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) 

In origine, quando stavo cercando di risolvere questo per conto mio, stavo usando il createStatement argomento vuoto() chiama ma questo ha portato all'eccezione sopra (ecco perché ho usato il TYPE_FORWARD_ONLY tipo di set di risultati ma sempre lo stesso risultato:

C'è qualcos'altro che posso provare con questo o ha bisogno di un approccio diverso?

+0

controllare cambiare se per mentre.just dire while (rs.next()) { System.out.print ("Conteggio di tutte le righe è" + rs.getInt ("righe")); } –

+0

@PiumiWandana: non ha funzionato con l'eccezione del tipo di cursore non valido. – Ocracoke

+0

Prova ad aggiungere il parametro 'ResultSet.CLOSE_CURSORS_OVER_COMMIT' in' createStatement() 'per vedere se aiuta –

risposta

0

"selezionare conteggio (*) come righe dalla tabella". Prova prima a sostituire l'alias da "righe" a "Risultato" o qualcosa del genere. Righe è una delle parole chiave riservate in Oracle. Non credo che selezionare restituisca alcun risultato oltre a un errore ora 00923

+0

Il codice non arriva fino a quando non inizializza l'oggetto istruzione. Tuttavia, è qualcosa da tenere a mente. – Ocracoke

0

Vale la pena provare quanto segue, in primo luogo per confermare che non è supportato, quindi di nuovo con tipi ResultSet diversi per trovarne uno che sia?

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

Per tutti e tre i tipi di ResultSet Java 1.7, restituiscono tutti false. – Ocracoke

+0

Se restituiscono false, non funzioneranno mai per te. Forse un problema con il driver ODBC che stai utilizzando? Questo ragazzo sembra avere lo stesso problema e ha lavorato intorno usando un diverso driver JDBC. http://www.mirthcorp.com/community/forums/archive/index.php/t-3966.html –

1

dal disco della documentazione di Oracle per il recupero di insiemi di dati:

Nota: Non tutti i database ei driver JDBC supportano tutti i tipi di risultati. Il metodo DatabaseMetaData.supportsResultSetType restituisce true se il tipo ResultSet specificato è supportato e falso in caso contrario.

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

Quindi, per iniziare, si consiglia di controllare che la connessione supporta il set di risultati che si sta tentando di utilizzare.

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

I metodi precedenti restituiscono entrambi true per la mia configurazione. E per questo motivo il codice che hai pubblicato funziona nel mio ambiente. Scommetto che uno di loro (o entrambi) restituirà false per te e la mia ipotesi è che si tratti di un problema con il tuo database stesso o con la versione del driver JDBC di Oracle che stai utilizzando. Si consiglia di assicurarsi che si sta utilizzando il driver più recente OJDBC che si può ottenere da qui:

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

Se si è verificato che si sta utilizzando il driver più recente, vorrei verificare la versione del database che si sta usando e i set di risultati supportati da esso.

Problemi correlati