2013-05-21 2 views
0

SQL Server를 사용하여 resultSet에서 jTable을 MS Driver 3.0으로 채우려고합니다.SQLServerException : 결과 집합이 닫혔습니다

결과 집합, 문 또는 연결을 닫지 않는 한 표가 생성됩니다. 내가 그들을 닫을 경우, 내 표는 다시 메시지와 함께 응답 :

com.microsoft.sqlserver.jdbc.SQLServerException: The result set is closed. 

나는 "테이블을 사용하는 방법"튜토리얼을 사용하여 내하는 TableModel를 작성하려고했습니다.

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]; 
      } 
     }; 

내 연결은 원래 자원 블록 시도에서 수행되었다,하지만 난에 넣어 문제를 찾으려고 노력에 시도 - 캐치 - 마지막으로 RS와 차단 : 여기

내 테이블 모델입니다 .close(), stmt.close() 및 connection.close(). 앞에서 언급했듯이, close 문이 없어도 제대로 작동하지만, 필자가 가지고 있다면 내 테이블 모델의 getValueAt 메서드에 도달 할 때 결과 집합이 닫히게된다고 나와 있습니다.

내 전체 코드는 여기에 있습니다 : 나는 모든 것을 던지기와 @Reimeus 말한 기반으로 처음부터 시작 결국

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); 
     } finally { 
      rs.close(); 
      stmt.close(); 
      connection.close(); 
     } 

    } 

    public static void main(String[] args) throws InterruptedException, SQLException { 

     Dashboard me = new Dashboard(); 

    } 
} 

업데이트 6-4-13

. 나는 긍정적이지는 않지만 이것이 효과가 있다고 생각합니다. 나가 인쇄 할 때 model.getRowCount() 그것은 저에게 나의 질문과 동일한 행이다는 것을 저에게 말한다. 코드는 다음과 같습니다.

DefaultTableModel model = new DefaultTableModel(); 

     ResultSetMetaData meta = rs.getMetaData(); 
     int numberOfColumns = meta.getColumnCount(); 
     while (rs.next()) { 
      Object[] rowData = new Object[numberOfColumns]; 
      for (int i = 0; i < rowData.length; ++i) { 
       rowData[i] = rs.getObject(i + 1); 

      } 
      model.addRow(rowData); 
      System.out.println(model.getColumnName(1)); 

     } 

문제점은 제가 테이블 모델로 테이블을 생성 할 수 없다는 것입니다. 내 마음 내가 생각하고에서는

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); 

:

DB를 RS RS에 표 모델 TM에 표 표에 ScrollPane에 에 스크로 르페

을 JTable가 여기 내가 일한 것이라고 생각 것입니다

나는 그것이 내가하고있는 바보 같은 것이라고 확신한다. 그러나 나는 아직도 그것을 인식 할만큼 충분히 지식이 없다.

+3

을 방지 할 수 있습니다. 질문은 무엇입니까? – Reimeus

+0

Jeez, 나는 여기에 게시하는 것이 너무 긴장되어 어떤 종류의 질문을하는 것을 사실 잊었다. 내 질문은 내 getValueAt 메서드 전에 내 결과 집합 닫는 이유는 무엇입니까? 지난 며칠 동안 여러 가지 예를보고 있었고이를 사용하는 방법의 예를 사용했습니다. 벡터로 작업 했었지만 vector가 더 이상 사용되지 않는 것을 알았습니다. 이제는 결과 세트에 데이터가 들어 있다는 것을 알았습니다. 단지 테이블에 넣고 싶습니다. 내 생각에 이것은 의미가 있지만, 나는 확실히 초보자이며 최후의 수단으로 여기에 왔습니다. – Prizz

답변

1

TableModel#getValueAt이 호출 될 때 ResultSet이 닫힙니다. Swing은 이벤트 모델을 사용하여 TableModel에서 요소를 retieve (?)합니다. 이것은 비동기 적으로 발생합니다. 즉, 기본 UI 스레드가 아닙니다. StatementResultSet과 같은 데이터베이스 리소스를 열어 두지 마십시오. 이것들은 데이터베이스 자체에 오버 헤드를 발생시킵니다.

JDBC 쿼리를 기반으로 TableModel을 업데이트 한 다음 연결된 데이터베이스 리소스를 닫습니다. 모델을 채우는 데 ResultSet 메서드를 사용하지 마십시오.

Creating a Table Model을 살펴보십시오. TableModel에 대한 고정 된 백업 데이터를 사용하여 데이터를 저장하는 방법을 보여줍니다. 또는 ArrayList이 사용될 수 있습니다.

시작하는 경우 DefaultTableModel은 사용하기 쉽고 변경할 수 있습니다.나중에는 제외 @mKorbel

에서 이와 example 같이 모델의 업데이트를 관리하는 진행 할 수 있습니다 사용 PreparedStatement보다는 Statement을 예상대로이 작동하고 SQL 주입 공격

+0

답장을 보내 주셔서 대단히 감사합니다. – Prizz

+0

PreparedStatements를 연구하고 진술 대신 사용하도록하십시오. 제 오류에 관해서 귀하의 설명은 왜 그것이 닫히는 지 이해합니다. 나는 그것을 지금 이해한다. 고맙습니다. "JDBC 쿼리를 기반으로 TableModel 업데이트"라고 언급했습니다. 우연히 당신이 제안하는 것처럼 JDBC를 사용하여 테이블 모델을 업데이트하는 방법에 대해 더 많이 배울 수있는 곳을 제안 해 주시겠습니까? 이 작업을 올바르게 수행하고 싶습니다. 현재 사용중인 리소스가 올바른 경로로 나를 이끌지 못하는 것은 분명합니다. – Prizz

+0

업데이트보기 ..... – Reimeus

관련 문제