Chr*_*eld 4 java jdbc resultset
我试图将数据显示到表格中,但在那里出现了一些错误。我使用的方法返回了所有相关数据,但是当我尝试将数据绑定到表中时,它显示了错误,错误说:
前向结果集不支持请求的操作。
这是我实现我的代码的方式:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码显示了我如何将数据绑定到 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);
}
Run Code Online (Sandbox Code Playgroud)
返回数据的方法 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();
}
}
Run Code Online (Sandbox Code Playgroud)
完整的堆栈跟踪
com.microsoft.sqlserver.jdbc.SQLServerException:仅转发结果集不支持请求的操作。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191) 在 com.microsoft.sqlserver.jdbc.SQLServerResultSet.throwNotScrollable(SQLServerResultSet.java:414) 在 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) at com.gaurav。 Auctionhouse.view.SellerPage.(SellerPage.java:29) at com.gaurav.auctionhouse.view.AddItems.jbtnSubmitActionPerformed(AddItems.java:265) at com.gaurav.auctionhouse.view.AddItems.access$100(AddItems.java: 33) 在 com。
希望得到积极的回应。
这个:
rs.last();
data = new Object[rs.getRow()][columnCount];
rs.beforeFirst();
Run Code Online (Sandbox Code Playgroud)
不会使用 forward-only ResultSet。除此之外,除了性能考虑之外,获取最后一行并获取其编号并不是确定行数的非常可靠的方法。
此外,JavaDoc onResultSet声明如下:
注意:对于结果集类型为 TYPE_FORWARD_ONLY 的 ResultSet,对 getRow 方法的支持是可选的
所以这也行不通。
但是,问题的根源在于您使用的是数组。最好避免 Java 中的数组,因为 Collection 框架提供了更大的灵活性。
在您的情况下,创建data一个List<Object[]>,并Object[columnCount]为从数据库中读取的每一行创建一个新的。更好的是,List为此也使用 a 。
一般来说,你的代码看起来像转换成 Java 的老式 C:没有final变量,在代码的开头声明变量,不使用 Collections 框架等。这是你可能想看看的东西。
编辑:添加正确的解决方案...当然,但您需要正确学习 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7849 次 |
| 最近记录: |