2014-05-11 5 views
3

데이터베이스에서 해당 값을 검색하는 방법이 있습니다. 내가 통과 할 때 쿼리는 ms 액세스에서 시도했을 때 제대로 작동했습니다. 오류는 "results [rowCount] [i] = rs.getString (i + 1);"에서 발생합니다. 이 메서드에 대한 내 전체 코드입니다.for 루프에서 유효하지 않은 커서 상태를 해결합니다.

private String[][] connectToDB2(String query) throws ClassNotFoundException{ 
     String[][] results = null; 
     try { 

       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
       String db = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:/EACA_AgroVentures1.accdb"; 
       conn = DriverManager.getConnection(db); 
       stmt = conn.prepareStatement(query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
       ResultSet rs = stmt.executeQuery(); 
       ResultSetMetaData rsm = rs.getMetaData(); 

       int columns = rsm.getColumnCount(); 
       int rows = getRowCount(rs); 
       if(query.contains("PIVOT")){ 
        System.out.println(query); 
        rows=getRowCount2(query); 

       }else if(query.contains("GROUP BY")){ 
        rows = getRowCount(query); 
       } 
       //int rows = rs.getFetchSize(); 
       int rowCount = 0; 
       results = new String[rows][columns]; 
       System.out.println(rows+" PIVOT "+columns); 


       System.out.println("Entering While Loop"); 
       do{  
        System.out.println(rowCount); 
        if(rowCount == rows){ 
         return results; 
        }else{ 
         for(int i = 0; i < columns; i++){ 
          System.out.println("Running While Loop"); 
          rs.next(); 
          results[rowCount][i] = rs.getString(i+1); 
          System.out.println(rowCount+",,,,"+i+" = "+results[rowCount][i]); 
         } 
        rowCount++; 
        } 
       }while(rs.isAfterLast()==true); 
       System.out.println("Exiting While Loop"); 
       rs.getStatement().close(); 
       conn.close(); 

     } catch (SQLException ex) { 
      Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); 
      ex.printStackTrace(); 
     } 
     return results; 
    } 

미리 감사드립니다.

편집 : ResultSet.TYPE_SCROLL_SENSITIVE를 ResultSet.TYPE_FORWARD_ONLY로 변경 한 후 잠시 동안 do-while을 변경했습니다. 모든 결과가 이미 표시되어 있지만 arrayIndexOutOfBoundsException이 표시됩니다. 이 문제를 어떻게 해결할 수 있습니까? 아래는 내 업데이트 된 코드입니다. 한 번에 열마다의 for 루프 내에서 - -

private String[][] connectToDB2(String query) throws ClassNotFoundException{ 
     String[][] results = null; 
     try { 

       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
       String db = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:/EACA_AgroVentures1.accdb"; 
       conn = DriverManager.getConnection(db); 
       stmt = conn.prepareStatement(query,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 
       ResultSet rs = stmt.executeQuery(); 
       ResultSetMetaData rsm = rs.getMetaData(); 

       int columns = rsm.getColumnCount(); 
       int rows = getRowCount(rs); 
       if(query.contains("PIVOT")){ 
        System.out.println(query); 
        rows=getRowCount2(query); 

       }else if(query.contains("GROUP BY")){ 
        rows = getRowCount(query); 
       } 
       //int rows = rs.getFetchSize(); 
       int rowCount = 0; 
       results = new String[rows][columns]; 
       System.out.println(rows+" PIVOT "+columns); 

       System.out.println("Entering While Loop"); 
       while (rs.next()) { 
        for(int i = 0; i < columns; i++){ 
         System.out.println("Running While Loop"); 
         results[rowCount][i] = rs.getString(i+1); 
         System.out.println(rowCount+",,,,"+i+" = "+results[rowCount][i]); 
        } 
        rowCount++; 
       } 

       System.out.println("Exiting While Loop"); 
       rs.getStatement().close(); 
       conn.close(); 

     } catch (SQLException ex) { 
      Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); 
      ex.printStackTrace(); 
     } 
     return results; 
    } 

당신은 행의 각 반복에 대해 ResultSet.next() 여러 번 호출

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 41 
    at com.eaca.MainFrame.connectToDB2(MainFrame.java:224) 
    at com.eaca.MainFrame.attendanceView(MainFrame.java:469) 
    at com.eaca.MainFrame.access$600(MainFrame.java:53) 
    at com.eaca.MainFrame$ChangeTab.stateChanged(MainFrame.java:536) 
    at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:416) 
    at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:270) 
    at javax.swing.DefaultSingleSelectionModel.fireStateChanged(DefaultSingleSelectionModel.java:132) 
    at javax.swing.DefaultSingleSelectionModel.setSelectedIndex(DefaultSingleSelectionModel.java:67) 
    at javax.swing.JTabbedPane.setSelectedIndexImpl(JTabbedPane.java:616) 
    at javax.swing.JTabbedPane.setSelectedIndex(JTabbedPane.java:591) 
    at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mousePressed(BasicTabbedPaneUI.java:3644) 
    at java.awt.Component.processMouseEvent(Component.java:6502) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320) 
    at java.awt.Component.processEvent(Component.java:6270) 
27,,,,0 = 23 at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:708) 
    at java.awt.EventQueue$4.run(EventQueue.java:706) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

답변

1

오류 당신이 시도로이 궁극적으로 예외 결과 끝까지 지나갈 길. 좀 더 일반적인 경우에는 ResultSet을 반복하는 것은 상당히 어색한 방법입니다. 기존의 while 루프를 사용하면, 여러분의 인생을 더 쉽게해야한다 :

int rowCount = 0; 
while (rs.next()) { 
    for(int i = 0; i < columns; i++){ 
     System.out.println("Running While Loop"); 
     results[rowCount][i] = rs.getString(i+1); 
     System.out.println(rowCount+",,,,"+i+" = "+results[rowCount][i]); 
    } 
    rowCount++; 
} 
+0

나는 당신의 제안을 시도했지만 hasNext() 기호를 찾을 수 없다고 말합니다. 이 문제를 해결하려면 어떻게해야합니까? – rocky

+0

@ user3615601 그것은 내 부분에서 바보 같은 실수였습니다. 결정된. – Mureinik

+0

거기에 내가 할 수있는 다른 방법이 있습니까? – rocky

1

액세스 데이터베이스 엔진 (크로스 탭 쿼리 포함) GROUP BY 절이있는 쿼리를 처리 할 때 그것은 업데이트 할 수 없습니다 레코드를 반환합니다. 따라서 resultSetType으로 ResultSet.TYPE_SCROLL_SENSITIVE 또는 ResultSet.TYPE_SCROLL_INSENSITIVE을 사용할 수 없습니다. ResultSet.TYPE_FORWARD_ONLY (기본값)을 사용해야합니다.

+0

제안 된대로 TYPE_SCROLL_SENSITIVE를 TYPE_FORWARD_ONLY로 변경했습니다. 유효하지 않은 커서 상태 오류가 제거되었지만 이제는 "java.sql.SQLException : Result set type is TYPE_FORWARD_ONLY"를 반환합니다. – rocky