" SQLite JDBC:内部状态不一致"从ResultSetMetaData尝试getColumnCount时

时间:2018-01-15 19:54:43

标签: java sqlite jdbc

正如标题所示,我试图从结果数据集中检索表模型。我还在学习如何使用数据库,因此我目前正在使用此代码:

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

但是我现在遇到的问题就是当程序到达检索列数的行时,它会给我“不一致的内部状态”#34;错误。完整列表:

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)

我已经检查了与堆栈溢出相关的唯一其他问题,但没有得到任何有关此问题的见解。我有什么可以做的吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我已经看到,当rs.next()ResultSet rs中没有更多记录指向时,通常会出现此错误。

我发现此代码段的错误,此处buildModel是类BuildModel的对象,构建方法buildOneTablebuildSecondTable都使用{{1 }}

rs.next()

在上面给出的代码中,您可以看到两个表都是使用类 ps = conn.prepareStatement(sqlQuery); rs = ps.executeQuery(); oneTable.setModel(buildModel.buildOneTable(rs)); twoTable.setModel(buildModel.buildSecondTable(rs)); ps.close(); rs.close(); 的方法buildOneTablebuildSecondTable构建的,只有一个buildModel变量{{1 }} 用来。由于PreparedStatement(内部ps)中的rs.next()指向了所有记录,因此出现错误,因为单个buildOneTable用于构建方法,它们共享相同的buildModel ps 1}}指针,现在在构建第二个表时没有更多要记录的记录。要解决此错误,您可以执行以下操作:

  1. 使用next()next()指针指向resultSet rs的开头。
  2. 或者在我的情况下再次执行语句,如:

    rs.first()