4 votes

"SQLite JDBC : inconsistent internal state" lors de la tentative de getColumnCount de ResultSetMetaData

Comme le titre l'indique, j'essaie de récupérer un modèle de tableau à partir d'un ensemble de résultats de données. Je suis encore en train d'apprendre à utiliser les bases de données et j'utilise actuellement ce code :

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import java.util.Vector;

import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class DbUtils {
    public static TableModel resultSetToTableModel(ResultSet rs) {
        try {
            ResultSetMetaData metaData = rs.getMetaData();
            int numberOfColumns = metaData.getColumnCount();
            Vector columnNames = new Vector();

            // Get the column names
            for (int column = 0; column < numberOfColumns; column++) {
                columnNames.addElement(metaData.getColumnLabel(column + 1));
            }

            // Get all rows.
            Vector rows = new Vector();
            while (rs.next()) {
                Vector newRow = new Vector();

                for (int i = 1; i <= numberOfColumns; i++) {
                    newRow.addElement(rs.getObject(i));
                }

                rows.addElement(newRow);
            }

            return new DefaultTableModel(rows, columnNames);
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }
}

Mais le problème que j'ai maintenant est que chaque fois que le programme atteint la ligne pour récupérer le nombre de colonnes, il me donne l'erreur "Inconsistent Internal State". Liste complète ici :

java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state
at org.sqlite.core.CoreResultSet.checkCol(CoreResultSet.java:81)
at org.sqlite.jdbc3.JDBC3ResultSet.getColumnCount(JDBC3ResultSet.java:699)
at DbUtils.resultSetToTableModel(DbUtils.java:14)
at Window.main(Window.java:170)

J'ai vérifié la seule autre question relative à ce sujet sur stack overflow mais je n'ai rien trouvé. Y a-t-il quelque chose que je puisse faire ?

Merci !

0voto

anotherGatsby Points 715

J'ai constaté que cette erreur se produit souvent lorsque rs.next() il n'y a plus d'enregistrements à pointer dans le fichier ResultSet rs .

J'ai trouvé l'erreur dans ce bout de code, ici le buildModel est un objet de la classe BuildModel les deux méthodes de construction buildOneTable y buildSecondTable utiliser le rs.next() .

        ps = conn.prepareStatement(sqlQuery);
        rs = ps.executeQuery();
        oneTable.setModel(buildModel.buildOneTable(rs));
        twoTable.setModel(buildModel.buildSecondTable(rs));            
        ps.close();
        rs.close();

dans le code donné ci-dessus, vous pouvez voir que les deux tableaux sont construits en utilisant des méthodes buildOneTable y buildSecondTable de la classe buildModel et un seul PreparedStatement variable ps est utilisé. L'erreur survient lorsque le rs.next() sur buildOneTable (à l'intérieur buildModel ) a pointé vers tous les enregistrements, puisqu'une seule et unique ps est utilisé pour les méthodes de construction, ils partagent tous deux la même next() et maintenant il n'y a plus d'enregistrements à pointer lors de la construction de la deuxième table. Pour résoudre cette erreur, vous pouvez faire ce qui suit :

  1. Repointer le next() pointeur vers le début du resultSet rs en utilisant rs.first() .
  2. Ou comme dans mon cas, en exécutant à nouveau la déclaration comme :

        ps = conn.prepareStatement(sql); 
        rs1 = ps.executeQuery();
        presentTable.setModel(buildModel.buildPresentLeaveTable(rs1)); 
        rs1.close();
        rs2 = ps.executeQuery();
        pastTable.setModel(buildModel.buildPastLeaveTable(rs2));
        ps.close();
        rs2.close();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X