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

Popular posts from this blog

python - How to create a legend for 3D bar in matplotlib? -

java - Multi-Label Document Classification -

php - Dynamic url re-writing using htaccess -