java - SQLServerException: The result set is closed -
i attempting populate jtable resultset using sqlserver ms driver 3.0.
the table generate long not close resultset, statement or connection. if close them, table replies message:
com.microsoft.sqlserver.jdbc.sqlserverexception: result set closed. i attempted create tablemodel using "how use tables" tutorial.
here table model:
tablemodel model = new abstracttablemodel() { private string[] columnname = {"employee id", "job start", "job id", "oper. id", "indir. id"}; public int getcolumncount() { return columns; } public int getrowcount() { return rows; } public object getvalueat(int row, int col) { try { rs.absolute(row+1); return rs.getobject(col+1); } catch (sqlexception ex) { system.err.println(ex); } return null; } public string getcolumnname(int col) { return columnname[col]; } }; my connections done in try resources block, in trying find issue put try-catch-finally block rs.close(), stmt.close(), , connection.close(). mentioned above, work fine if not have close statements, if have them, states resultset closed time gets getvalueat method in table model.
my whole code here:
package dashboard; import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.resultsetmetadata; import java.sql.sqlexception; import java.sql.statement; import java.util.logging.level; import java.util.logging.logger; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.event.tablemodellistener; import javax.swing.table.abstracttablemodel; import javax.swing.table.tablemodel; import org.omg.corba.data_conversion; public class dashboard extends jframe { resultset rs; connection connection; statement stmt; resultsetmetadata md; jscrollpane scrollpane; int columns, rows; jframe frame; string connectionurl; @suppresswarnings("empty-statement") public dashboard() throws sqlexception { try { connection = drivermanager.getconnection(connectionurl); stmt = connection.createstatement(resultset.type_scroll_insensitive, resultset.concur_read_only); rs = stmt.executequery(query); resultsetmetadata md = rs.getmetadata(); //count number of rows rs.last(); rows = rs.getrow(); rs.first(); //get column count columns = md.getcolumncount(); tablemodel model = new abstracttablemodel() { private string[] columnname = {"employee id", "job start", "job id", "oper. id", "indir. id"}; public int getcolumncount() { return columns; } public int getrowcount() { return rows; } public object getvalueat(int row, int col) { try { rs.absolute(row+1); return rs.getobject(col+1); } catch (sqlexception ex) { system.err.println(ex); } return null; } public string getcolumnname(int col) { return columnname[col]; } }; jtable table = new jtable(model); table.setautocreaterowsorter(true); scrollpane = new jscrollpane(table); getcontentpane().add(scrollpane); frame = new jframe(); frame.setdefaultcloseoperation(exit_on_close); frame.pack(); frame.settitle("employee dashboard"); frame.setbounds(300, 300, 1300, 750); frame.setresizable(false); frame.add(scrollpane); frame.setvisible(true); } catch (sqlexception ex) { system.err.println(ex); } { rs.close(); stmt.close(); connection.close(); } } public static void main(string[] args) throws interruptedexception, sqlexception { dashboard me = new dashboard(); } } update 6-4-13
i ended tossing out , starting scratch based on @reimeus said. not positive, think working. when out print model.getrowcount() tells me has same rows query. code here:
defaulttablemodel model = new defaulttablemodel(); resultsetmetadata meta = rs.getmetadata(); int numberofcolumns = meta.getcolumncount(); while (rs.next()) { object[] rowdata = new object[numberofcolumns]; (int = 0; < rowdata.length; ++i) { rowdata[i] = rs.getobject(i + 1); } model.addrow(rowdata); system.out.println(model.getcolumnname(1)); } the issue having cannot generate table table model. here thought have worked:
jtable table = new jtable(model); table.setautocreaterowsorter(true); scrollpane = new jscrollpane(table); getcontentpane().add(scrollpane); frame = new jframe(); frame.setdefaultcloseoperation(exit_on_close); frame.pack(); frame.add(scrollpane); frame.setvisible(true); in mind thinking:
db rs rs table model tm table table scrollpane scrollpane jtable
i sure dumb doing still not knowledgeable enough recognize yet.
the resultset closed when tablemodel#getvalueat invoked swing uses event model retieve elements tablemodel. occurs asynchronously, i.e. not on main ui thread. don't leave database resources such statement , resultset open. these create overhead on database itself.
update tablemodel based on jdbc queries close associated database resources. don't use resultset methods populating model.
have @ creating table model. shows how fixed backing data used hold data tablemodel. alternatively arraylist may used.
if you're starting out, defaulttablemodel easy use , mutable. later can progress managing update of model such in example @mkorbel
aside: use preparedstatement rather statement protect against sql injection attacks
Comments
Post a Comment