2017-05-13 2 views
0

J'essaie d'utiliser CachedRowSet avec SQLite et le pilote Xerial https://bitbucket.org/xerial/sqlite-jdbc. méthodePilote JDBC CachedRowSet et SQLite

Si je l'appelle execute() comme ça:

Connection connection = DriverManager.getConnection("jdbc:sqlite:sample.db"); 
    CachedRowSet crs = new CachedRowSetImpl(); 
    crs.setCommand("select * from person"); 
    crs.execute(connection); 

Je reçois SQLException "pas mis en œuvre par le pilote JDBC SQLite":

at com.sun.rowset.internal.CachedRowSetReader.readData(Unknown Source) 
    at com.sun.rowset.CachedRowSetImpl.execute(Unknown Source) 
    at com.sun.rowset.CachedRowSetImpl.execute(Unknown Source) 
    at com.oracle.tutorial.jdbc.CachedRowSetSample.testPaging(CachedRowSetSample.java:100) 
    at com.oracle.tutorial.jdbc.CachedRowSetSample.main(CachedRowSetSample.java:273) 

d'autre part ResultSet et remplir() inséed d'excecute() fonctionne ok:

Connection connection = DriverManager.getConnection("jdbc:sqlite:sample.db"); 
    statement = connection.createStatement(); 
    ResultSet rs = statement.executeQuery("select * from person"); 
    CachedRowSet crs = new CachedRowSetImpl(); 
    crs.populate(rs); 

Quelqu'un sait-il ce qui ne va pas avec execute()?

+0

Veuillez publier la pile-pile d'exception complète. Aussi: pourquoi voulez-vous utiliser 'CachedRowSet', à mon avis c'est plutôt bogué et c'est rarement utile. –

+0

l'exception ci-dessus est de l'exemple d'oracle, j'ai réduit le codage et voici l'exception complète mais à mon avis n'a pas de nouvelles informations: 'Exception dans le fil" principal "java.sql.SQLException: pas implémenté par le pilote SQLite JDBC à com.sun.rowset.internal.CachedRowSetReader.readData (source inconnue) à com.sun.rowset.CachedRowSetImpl.execute (source inconnue) à First.rowSet1 (First.java:33) à First.main (First.java:79) ' –

+0

Je m'attendais à une cause d'exception qui inclut quelle méthode est appelée dans le pilote SQLite qui lève réellement" non implémenté par le pilote SQLite JDBC ", mais en regardant le code réel dans' CachedRowSetReader' il lance une nouvelle exception avec le message de l'exception initiale sans paramétrer l'exception cause ... Comme je l'ai dit: à mon avis c'est plutôt bogué et c'est rarement utile. –

Répondre

0

Malheureusement, il existe une poignée de fonctions JDBC que vous aurez à mettre en œuvre des solutions de contournement pour l'utilisation de SQLite. Cela arrive à être l'un d'entre eux. Probablement la meilleure solution alternative est de mettre tout le résultat mis en une liste <> et travailler avec ce:

// Variables. 
final int TIMEOUT_DEFAULT=30; 
String query = "select * from person"; 
ResultSet rs; 
Statement statement; 
List<String[]> people; 

... 

// Create query and execute. (Connection established, database open.) 
try {     
    statement = connection.createStatement(); 
    statement.setQueryTimeout(TIMEOUT_DEFAULT); 
    connection.setAutoCommit(true); 
    rs = statement.executeQuery(query); 
} catch (SQLException e) { 
    // If error, close connection & ignore close errors. 
    try { connection.close(); } 
     catch (SQLException e2) { /* Ignore */ } 
    // Throw new error. 
    throw new SQLException("Query failed",e); 
} 

// Retrieve results. 
try { 
    people = new ArrayList<>(); 
    while (rs.next()) { 
     people.add(new String[]{ 
      rs.getString(1), rs.getString(2), rs.getString(3) 
     }); 
    } 
} catch (SQLException e) { 
    // If error, close connection & ignore close errors. 
    try { connection.close(); } 
     catch (SQLException e2) { /* Ignore */ } 
    // Throw new error. 
    throw new SQLException("Error retrieving data",e); 
} 

// Close connection, ignore error. 
try { 
    connection.close(); 
} catch (SQLException e) { /* Ignore */ } 

// Print output. 
for (String[] p : people) { 
    System.out.println(Arrays.deepToString(p)); 
} 

Une réponse this post contient un commentaire sur la simulation d'une fonction si elle est pas pris en charge par votre pilote.