正如标题所示,我试图从结果数据集中检索表模型。我还在学习如何使用数据库,因此我目前正在使用此代码:
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)
我已经检查了与堆栈溢出相关的唯一其他问题,但没有得到任何有关此问题的见解。我有什么可以做的吗?
谢谢!
答案 0 :(得分:0)
我已经看到,当rs.next()
在ResultSet
rs
中没有更多记录指向时,通常会出现此错误。
我发现此代码段的错误,此处buildModel
是类BuildModel
的对象,构建方法buildOneTable
和buildSecondTable
都使用{{1 }}
rs.next()
在上面给出的代码中,您可以看到两个表都是使用类 ps = conn.prepareStatement(sqlQuery);
rs = ps.executeQuery();
oneTable.setModel(buildModel.buildOneTable(rs));
twoTable.setModel(buildModel.buildSecondTable(rs));
ps.close();
rs.close();
的方法buildOneTable
和buildSecondTable
构建的,只有一个buildModel
变量{{1 }} 用来。由于PreparedStatement
(内部ps
)中的rs.next()
指向了所有记录,因此出现错误,因为单个buildOneTable
用于构建方法,它们共享相同的buildModel
ps
1}}指针,现在在构建第二个表时没有更多要记录的记录。要解决此错误,您可以执行以下操作:
next()
将next()
指针指向resultSet
rs
的开头。或者在我的情况下再次执行语句,如:
rs.first()