2009-06-12 11 views
0

Ich versuche, eine Datenbank-Paging-Lösung (Forward nur erforderlich) zu implementieren mit einer CachedRowSet, um eine AS400JDBCResultSet mit den Ergebnissen meiner Abfrage zu pagen.Funktioniert CachedRowSet mit allen ResultSet-Implementierungen?

Ich habe versucht, den

CachedRowSet cachedRowSet = new CachedRowSetImpl(); 
cachedRowSet.setMaxRows(10); 
cachedRowSet.setPageSize(10); 
cachedRowSet.populate(resultSet); 

Ansatz, aber die volle Ergebnismenge (65 Datensätze) in der ersten Seite zurück (das heißt durch cachedRowSet.next() Aufruf). Ich habe auch versucht, die

CachedRowSet cachedRowSet = new CachedRowSetImpl(); 
cachedRowSet.setPageSize(10); 
cachedRowSet.setMaxRows(0); 
cachedRowSet.setUsername("username"); 
cachedRowSet.setPassword("password"); 
cachedRowSet.setUrl("jdbc:as400://dev;naming=system;libraries=*LIBL;prompt=false;"); 
cachedRowSet.setCommand(query); 
cachedRowSet.execute(connection); 

Ansatz, aber ich bekomme die folgende Ausnahme auf den Anruf execute() geworfen

Exception in thread "main" java.lang.AbstractMethodError: java/sql/DatabaseMetaData.locatorsUpdateCopy()Z 
    at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:712) 
    at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:617) 
    at com.sun.rowset.internal.CachedRowSetReader.readData(CachedRowSetReader.java:190) 
    at com.sun.rowset.CachedRowSetImpl.execute(CachedRowSetImpl.java:756) 

ich auf beiden IBM & Sun JREs ausprobiert habe.

Irgendwelche Ideen? Wird diese Funktionalität von meinem JDBC-Treiber einfach nicht unterstützt?

Update: Auch passiert mit MySQL-Treiber - also muss ich etwas anderes falsch machen, oder?

Update (2): haben es auf Java 5.0 & 6.0 für MySQLs Driver zu arbeiten, aber nur auf 6,0 für meine AS400JDBCDriver - beide Verfahren unter Verwendung von 2 von oben. Scheint auf jeden Fall ziemlich langsam zu sein.

Antwort

0

Es klingt, als ob Ihr Treiber möglicherweise nicht JDBC 3.0-kompatibel ist, wenn Rowsets in die API eingeführt wurden. Der AbstractMethodError unterstützt dies.

Überprüfen Sie in Ihrer Treiberdokumentation, welche JDBC-Version unterstützt wird.

+0

Das Glas der Fahrer hat eine Klasse AS400JDBCRowSet enthält, so dass ich mich vorstellen, dies ist nicht das Problem. Außerdem haben wir es geschafft, es mit einem 6.0 JRE & dem gleichen Treiber zu arbeiten. Danke aber :) –

-2

Die Art, wie die Treiber aufgerufen werden, hat sich mit den neueren Versionen von Java geändert. Die alte Schule hatte zusätzliche Kessel-Platte, aber es funktioniert immer noch mit Java 6.

Connection c = null; 
try { 
     Class.forName(driverString); 
    } catch (ClassNotFoundException e) { 
     //TODO 
    } 
c = DriverManager.getConnection(url, username, password); 
+0

Danke für die Antwort, aber ich habe versucht, die Methode der Treibernamen aus dem DriverManager javadocs (Einstellung der jdbc.drivers-System-Eigenschaft) zu verwenden. Es macht keinen Unterschied - der gleiche Fehler für den AS400-Treiber :( –

+0

Unklar, was Sie hier sagen. Die Zeile "Class.forName()" wurde in JDBC 4, 2007 unnötig. – EJP