iReport: ArrayIndexOutOfBounds

epitox

Mitglied
Morgen,

ich steh (mal wieder) vor einem Problem und weiss nicht weiter.

Folgende Situation: Ich frage Daten von einem SQL-Server ab und möchte diese in einem iReport ausgeben.

Beim Erstellen des Reports erhalte ich jedesmal folgende Fehlermeldung:
9d7e78-1348557997.png


Java:
                   Vector columnNames = new Vector();
                            Vector data = new Vector();
                                                        
                            try{
                                //Abfrage definieren
                                Class.forName( "net.sourceforge.jtds.jdbc.Driver" );
        Connection cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://xyz:1433/FLEETBOARD", "adm", "helis" );
        Statement myStmt = cn.createStatement();
        ResultSet rst = myStmt.executeQuery("SELECT NameID, Note, KW FROM Auswertung");
                                ResultSetMetaData md = rst.getMetaData();
                                int columns = md.getColumnCount();
                                //  Spaltennamen ermitteln
                                for (int i = 1; i <= columns; i++) {
                                    String colname=md.getColumnName(i);
                                    columnNames.addElement( colname );
                                }
                                //  Zeileninhalt ermitteln
                                while (rst.next()) {
                                    Vector row = new Vector(columns);
                                    for (int i = 1; i <= columns; i++) {

                                        row.addElement( rst.getObject(i) );
                                    }
                                    data.addElement( row );
                                }
                                rst.close();
                                myStmt.close();
                                cn.close();
                            } catch(Exception e) {
                                System.out.println("Fehler:" +e);
                            }

                            report = new JTable(data, columnNames);
      try {
      DefaultTableModel de = (DefaultTableModel) report.getModel();
      JRTableModelDataSource datasource = new JRTableModelDataSource(de);
      String reportSource = "Bestellliste.jrxml";
      
      JasperReport jr = JasperCompileManager.compileReport(reportSource);
      
      Map <String, Object> params = new HashMap <String, Object>();
      params.put ("title1", "title 1");
      
      JasperPrint jp = JasperFillManager.fillReport (jr, params, datasource);
      
      JasperViewer.viewReport (jp, false);
        } catch (Exception e)
        {
            JOptionPane.showMessageDialog(null,"Fehler: "+e,"Fehler", JOptionPane.CANCEL_OPTION);
        }

Der Report sieht wie folgt aus:

958ba9-1348558209.png


Meine Tabelle hat 3 Spalten und der Report auch, darum versteh ich nicht, warum er diese Fehlermeldung ausspuckt.

Hoffe, hier kann mir einer helfen =)

Danke!
 
M

maki

Gast
[c]Vector row = new Vector(columns);[/c]
Arrays, Vector, List, etc. pp. beginnen beim Index 0, ResultSets leider beim Index 1...

Du musst also beim Vector mit 0 anfangen, nicht mit 1.
 

epitox

Mitglied
Dumme Frage, aber wie mach ich das? :D

Was mich dann auch noch wundert ist, dass wenn ich Daten aus einer Access-Datenbank abfrage und in einem Report ausgebe, alles wunderbar funktioniert. ???:L
 

Ark

Top Contributor
Java:
for (int i = 1; i <= columns; i++) {

Java:
for (int i = 0; i < columns; i++) {
Ark
 

Ark

Top Contributor
Java:
rst.getObject(i)

Java:
rst.getObject(i + 1)
(Und ähnliche Stellen, ich weiß aber nicht, ob das jetzt überhaupt eine solche Stelle wäre. Aber das Prinzip wird vielleicht klar.)

In Java grundsätzlich immer bei 0 anfangen (wie ich schon geschrieben habe; so sehen Schleifen in Java typischerweise aus). Falls das andere Schnittstellen anders haben wollen (z.B. eben deine SQL-Schnittstelle oder Menschen ;)), rechne den entsprechenden Abstand (Offset) nur an der jeweiligen Stelle ein. Es anders zu machen (z.B. Schleifenzähler in solchen Fällen bei 1 beginnen zu lassen etc.), verwirrt die meisten (Java-)Programmierer nur, und wahrscheinlicher ist es sogar falsch.

Ark
 
Zuletzt bearbeitet:

epitox

Mitglied
Java:
try{
                                //Abfrage definieren
                                Class.forName( "net.sourceforge.jtds.jdbc.Driver" );
        Connection cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://SQLHELISCLUSTER:1433/FLEETBOARD", "adm", "helis" );
        Statement myStmt = cn.createStatement();
        ResultSet rst = myStmt.executeQuery("SELECT NameID, Note, KW FROM Auswertung");
                                ResultSetMetaData md = rst.getMetaData();
                                int columns = md.getColumnCount();
                                //  Spaltennamen ermitteln
                                for (int i = 0; i < columns; i++) {
                                    String colname=md.getColumnName(i+1);
                                    columnNames.addElement(colname);
                                }
                                //  Zeileninhalt ermitteln
                                while (rst.next()) {
                                    Vector row = new Vector(columns);
                                    for (int i = 0; i < columns; i++) {

                                        row.addElement( rst.getObject(i+1) );
                                    }
                                    data.addElement(row);
                                }
                                rst.close();
                                myStmt.close();
                                cn.close();
                            } catch(Exception e) {
                                System.out.println("Fehler:" +e);
                            }

In meinen Augen hab ich ich´s jetzt an allen nötigen Stellen geändert, jetzt taucht aber wieder der ArrayIndex-Fehler auf. Allerdings hab ich die Daten jetzt wenigstens in der Tabelle :D
 

Ark

Top Contributor
Wirf doch mal einen Blick in die Dokumentation(en). Wenn da steht, dass die Zählung bei 1 beginnt, rechnest du noch +1, und wenn die Zählung bei 0 beginnt, lässt du das +1 weg. Du könntest auch frei nach trail-and-error-Methodik einfach an jeder Stelle, an der ein Fehler auftritt, ein +1 hinzufügen, wenn es noch nicht da ist, bzw. das +1 wieder entfernen, falls es schon da ist, eben so lange, bis gar kein Fehler mehr auftritt.

Ark
 

epitox

Mitglied
Hab es jetzt mal mit der Abfrage aus der Access-mdb abgeglichen und mir ist aufgefallen, dass ich im dortigen SELECT-Befehl 5 Spalten abfrage und im Bericht nur 3 verwende.

Das gleiche hab ich dann auf den SELECT angewandt, der mir Daten vom SQL-Server ausliest und siehe da. es geht.

Warum ist mir momentan allerdings noch nicht so ganz einleuchtend...
 

Ähnliche Java Themen

Neue Themen


Oben