各位达人帮忙看看下列代码,有这么一个奇怪事,当sql是简单的查询,如"select * from STUDENT"时,程序不报错,
但如果sql="select count(*)from STUDENT"时,则出现异常:无效的游标状态;
GUI上按钮触发事件调用selectSQL(String sql, JTable table)),我就想使用这个函数,支持各种SQL查询,请各位帮我完善,谢谢!!
public ResultSet selectSQL(String sql, JTable table) {
try {
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
resultSet = statement.executeQuery(sql); displayResultSet(table, resultSet); System.out.println("Select Successful! ");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultSet;
} public void displayResultSet(JTable table, ResultSet rs)
throws SQLException {
rs.beforeFirst();// 指针移到第一条记录前面
boolean hasRecords = rs.next();
if (!hasRecords) { // 记录集为空,提示一条消息
JOptionPane.showMessageDialog(table, "无相关记录", "Check your input!",
JOptionPane.ERROR_MESSAGE);
return;
}
Vector<String> columnHeads = new Vector<String>();// 用于存储表头字段(列名)
Vector<Vector> rows = new Vector<Vector>();// 用于存储记录行
try {
// 获取字段的名称
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
columnHeads.addElement(rsmd.getColumnName(i));
System.out.println("ColumnName:" + rsmd.getColumnName(i));
} do {// 获取记录集
rows.addElement(getNextRow(rs, rsmd)); } while (rs.next()); // 建立相应的TableModel,并将TableModel应用到Table中显示出来 DefaultTableModel model = new DefaultTableModel(rows, columnHeads);
table.setModel(model);
return;
} catch (SQLException exc) {
JOptionPane.showMessageDialog(table, exc.toString(),
"Check your input!", JOptionPane.ERROR_MESSAGE);
return;
}
} private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)
throws SQLException {
Vector<String> currentRow = new Vector<String>(); for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
currentRow.addElement(rs.getString(i));
//System.out.println("Row:" + rs.getString(i));
}
return currentRow; // 返回一条记录
}
但如果sql="select count(*)from STUDENT"时,则出现异常:无效的游标状态;
GUI上按钮触发事件调用selectSQL(String sql, JTable table)),我就想使用这个函数,支持各种SQL查询,请各位帮我完善,谢谢!!
public ResultSet selectSQL(String sql, JTable table) {
try {
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
resultSet = statement.executeQuery(sql); displayResultSet(table, resultSet); System.out.println("Select Successful! ");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultSet;
} public void displayResultSet(JTable table, ResultSet rs)
throws SQLException {
rs.beforeFirst();// 指针移到第一条记录前面
boolean hasRecords = rs.next();
if (!hasRecords) { // 记录集为空,提示一条消息
JOptionPane.showMessageDialog(table, "无相关记录", "Check your input!",
JOptionPane.ERROR_MESSAGE);
return;
}
Vector<String> columnHeads = new Vector<String>();// 用于存储表头字段(列名)
Vector<Vector> rows = new Vector<Vector>();// 用于存储记录行
try {
// 获取字段的名称
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
columnHeads.addElement(rsmd.getColumnName(i));
System.out.println("ColumnName:" + rsmd.getColumnName(i));
} do {// 获取记录集
rows.addElement(getNextRow(rs, rsmd)); } while (rs.next()); // 建立相应的TableModel,并将TableModel应用到Table中显示出来 DefaultTableModel model = new DefaultTableModel(rows, columnHeads);
table.setModel(model);
return;
} catch (SQLException exc) {
JOptionPane.showMessageDialog(table, exc.toString(),
"Check your input!", JOptionPane.ERROR_MESSAGE);
return;
}
} private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd)
throws SQLException {
Vector<String> currentRow = new Vector<String>(); for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
currentRow.addElement(rs.getString(i));
//System.out.println("Row:" + rs.getString(i));
}
return currentRow; // 返回一条记录
}
sql="select COUNT(*) AS NUM from STUDENT" 就报错了为何?