2010-11-26 5 views
0

Quelqu'un peut-il me dire ce que je fais mal ici? Je lance cette fois sur 100, et environ 2-8 fois, il échoue avec l'erreur: java.lang.ArrayIndexOutOfBoundsException: 10java.lang.ArrayIndexOutOfBoundsException lors de la création d'un tableau à partir de JDBC ResultSet

public String[][] queryResult(String QUERY) throws SQLException{ 

    Connection con = getPoolConnection(); 
    Statement st2 = con.createStatement(); 
    ResultSet rs = st2.executeQuery(QUERY); 
    System.out.println("Run query: "+QUERY); 
    // outPrint(logFile,"Run query: "+QUERY+""); 
    ResultSetMetaData metaData = rs.getMetaData(); 


    int noOfColumns = metaData.getColumnCount(); 
    //System.out.print(metaData.toString()+" : "); 
    this.columnName = new String[noOfColumns]; 
    this.columnTypes = new String[noOfColumns]; 
    for (int i = 1; i <= noOfColumns; i++) { 
     this.columnName[i-1] = metaData.getColumnLabel(i); 
     this.columnTypes[i-1] = metaData.getColumnTypeName(i); 
     System.out.print(this.columnName[i-1]+" - "+this.columnTypes[i-1]+" , "); 

    } 
    System.out.println(" - "); 
    rs.last(); 
    int noOfRows = rs.getRow(); 
    rs.beforeFirst(); 

    String[][] result = new String[noOfRows][noOfColumns]; 

    int loop = 0; 
    while(rs.next()) { 
     loop++; 
     for (int i = 1; i <= noOfColumns; i++) { 
      result[loop-1][i-1] = getResultSwitch(metaData.getColumnType(i), rs, i); 
      //System.out.println("result "+this.columnTypes[i-1]+" : "+result[loop-1][i-1]); 
      System.out.print(result[loop-1][i-1]+" , "); 
     } 
     System.out.println(" - "); 
    } 

    rs.close(); 
    st2.close(); 
    con.close(); 
    //System.out.println("Closed connection."); 

    return result; 
} 
+0

Petit conseil, réutilisez vos données: remplacez 'getResultSwitch (metaData.getColumnType (i) ...' par 'getResultSwitch (this.columnTypes [i] ...' – Destroyica

+0

Quel est le numéro de ligne où l'exception est levée? lignes de votre stacktrace, et pouvez-vous reformater les appels de méthode imbriqués avec des définitions de variables pour trouver la racine de l'exception –

Répondre

-3

Bien que je ne sais pas quelle ligne de code génère cette exception que je vois au moins un problème dans votre code:

result[loop-1][i-1] 
boucle 1

est -1 sur la première itération car boucle = 0

+0

Merci AlexR pour votre réponse rapide! Des suggestions sur ce qu'il devrait être? – James

+0

Non, il y a une boucle ++ avant la ligne question –

0

au lieu d'utiliser rs.last() et rs.getRow() pour faire un tableau statique, je suggère au contraire que vous faites une liste de tableaux de lignes de résultats, et le convertir dans un tableau quand yo J'ai fini. Pouvez-vous: fournir le code de `getResultSwitch` et nous donner le numéro de ligne où l'exception est levée?

System.out.println(" - "); 
    //rs.last(); 
    //int noOfRows = rs.getRow(); 
    //rs.beforeFirst(); 

    //String[][] result = new String[noOfRows][noOfColumns]; 
    List<String[]> tempResult = new ArrayList<String[]>(); 

    //int loop = 0; 
    while(rs.next()) { 
     //loop++; 
     String[] row = new String[noOfColumns]; 
     for (int i = 0; i < noOfColumns; i++) { 
      row[i] = getResultSwitch(metaData.getColumnType(i+i), rs, i); 
      //System.out.println("result "+this.columnTypes[i-1]+" : "+result[loop-1][i-1]); 
      //System.out.print(result[loop-1][i-1]+" , "); 
      tempResult.add(row); 
     } 
     System.out.println(" - "); 
    } 

    rs.close(); 
    st2.close(); 
    con.close(); 
    //System.out.println("Closed connection."); 
    return tempResult.toArray(new String[0][noOfColumns]); 
+0

Merci beaucoup Paul Toute chance de m'aider à réécrire cela pour mieux fonctionner? – James

+0

Merci Paul pour votre aide, j'ai essayé ceci et malheureusement obtenir: Exception java.sql.SQLException: Index de colonne hors de portée – James

+0

Je voudrais ajouter que ne pas le convertir en un tableau du tout si possible et coller avec un List <> ou ArrayList <> i Nstead est prudent. –

Questions connexes