我正在尝试将数据显示到表中,但在那里遇到了一些错误。我使用的方法向我返回所有相关数据,但是当我尝试将数据绑定到表中时,它向我显示错误并且错误说:
仅转发结果集不支持请求的操作。
这就是我实现代码的方式:
public class Table {
public static DefaultTableModel buildDataTable(ResultSet rs) {
ResultSetMetaData metaData;
Object[][] data = null;
Object[] columnNames = null;
try {
metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
columnNames = new Object[columnCount];
int index = 0;
for (int column = 1; column <= columnCount; column++) {
columnNames[index] = metaData.getColumnName(column).toUpperCase();
index++;
}
rs.last();
data = new Object[rs.getRow()][columnCount];
rs.beforeFirst();
while (rs.next()) {
for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
data[rs.getRow() - 1][columnIndex - 1] = rs.getObject(columnIndex);
}
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return new DefaultTableModel(data, columnNames);
}
}
以下代码显示了如何将数据绑定到 jtable 中:
try {
dtm = com.gaurav.auctionhouse.common.Table.buildDataTable(new ItemDAOImp().getItemByUserId(MainClass.userId));
jTable1.setModel(dtm);
} catch (SQLException ex) {
Logger.getLogger(SellerPage.class.getName()).log(Level.SEVERE, null, ex);
}
以ResultSet
为单位返回数据的方法
public ResultSet getItemByUserId(int id) throws SQLException {
String query = "SELECT id, type, description, state, reservedPrice, itemName, image FROM tbl_item WHERE userId = ?";
try {
pst = DBConnection.getConnection().prepareStatement(query);
pst.setInt(1, id);
res = pst.executeQuery();
return res;
} catch (SQLException ex) {
throw new SQLException(ex);
} finally {
DBConnection.getConnection().close();
}
}
完整的堆栈跟踪
com.microsoft.sqlserver.jdbc.SQLServerException:仅转发结果集不支持请求的操作。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191( at com.microsoft.sqlserver.jdbc.SQLServerResultSet.throwNotScrollable(SQLServerResultSet.java:414( at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetIsScrollable(SQLServerResultSet.java:437( at com.microsoft.sqlserver.jdbc.SQLServerResultSet.last(SQLServerResultSet.java:1477( at com.gaurav.auctionhouse.common.Table.buildDataTable(Table.java:34( 在com.gaurav.auctionhouse.view.SellerPage。(卖家页面.java:29( at com.gaurav.auctionhouse.view.AddItems.jbtnSubmitActionPerformed(AddItems.java:265( at com.gaurav.auctionhouse.view.AddItems.access$100(AddItems.java:33( at com.gaurav.auctionhouse.view.AddItems$2.actionPerform(AddItems.java:111( at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022( at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348( at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402( at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259(
希望得到积极的回应。
这个:
rs.last();
data = new Object[rs.getRow()][columnCount];
rs.beforeFirst();
不适用于仅转发ResultSet
.除此之外,除了性能考虑之外,获取最后一行并获取其编号并不是确定行数的非常可靠的方法。
此外,ResultSet
上的JavaDoc声明如下:
注意:对于结果集类型为 TYPE_FORWARD_ONLY 的结果集,对 getRow 方法的支持是可选的
所以这也行不通。
但是,问题的根源在于您使用的是数组。最好避免使用 Java 中的数组,因为 Collection 框架提供了更大的灵活性。
在您的情况下,data
设为List<Object[]>
,并为从数据库中读取的每一行创建一个新Object[columnCount]
。更好的是,也为此使用List
。
一般来说,你的代码看起来像老式的C转换为Java:没有final
变量,在代码开头声明变量,不使用集合框架等。这是您可能想看一下的东西。
编辑:添加正确的解决方案...当然,但你需要正确学习Java。您现在可能会获得解决方案,但您仍然需要编写代码。下面仍然存在问题,例如异常处理,这也阻止我将所有变量final
,但您可以自己处理。
public class Table {
public static DefaultTableModel buildDataTable(final ResultSet rs) {
final List<Object[]> data = new ArrayList<>();
String[] columnNames = null;
int columnCount = 0;
try {
final ResultSetMetaData metaData = rs.getMetaData();
columnCount = metaData.getColumnCount();
columnNames = new String[columnCount];
for (int column = 0; column < columnCount; column++) {
columnNames[column] = metaData.getColumnName(column + 1).toUpperCase();
}
while (rs.next()) {
final Object[] row = new Object[columnCount];
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
row[columnIndex] = rs.getObject(columnIndex + 1);
}
data.add(row);
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return new DefaultTableModel(data.toArray(new Object[data.size()][columnCount]), columnNames);
}
}
这是由于 sql 服务器的较低版本而发生的,如果您使用的是 JPA 或休眠或简单的 jdbc,那么如果驱动程序低于 mssql 的 2006 并且高于或等于 2006 版本,则在 HBM 配置中更改您的方言。