Hashtable !

Status
Nicht offen für weitere Antworten.
M

Manuela

Gast
Hallo ich bekomme immer eine Fehlermeldung ind weiß nicht was ich hier falsch mache.

  • SCHWERWIEGEND: null
    java.sql.SQLException: Column index out of range.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
    at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:398)
    at com.mysql.jdbc.ResultSetMetaData.getColumnTypeName(ResultSetMetaData.java:290)

und hier der Code
Code:
   public void select_datenbank(String sql){
        try {
            
            int aa=0;
            Hashtable<Number, Hashtable<Object, Object>> tabelle =new Hashtable<Number, Hashtable<Object, Object>> ();
            c = Konektor.Connector.getInstance().getConnection();
            java.sql.ResultSet r = null;
            r = c.createStatement().executeQuery(sql);
            ResultSetMetaData rsmd = r.getMetaData();
            while(r.next()) {
                Hashtable<Object,Object> liste = new Hashtable<Object,Object>();
                for (int i = 0; i <= rsmd.getColumnCount(); i++) {
                    if (rsmd.getColumnTypeName(i).toString().equals("INTEGER") ||
                            rsmd.getColumnTypeName(i).toString().equals("INTEGER UNSIGNED") ||
                            rsmd.getColumnTypeName(i).toString().equals("TINYINT")) {
                        liste.put(rsmd.getColumnName(i), r.getInt(rsmd.getColumnName(i)));
                    } else if (rsmd.getColumnTypeName(i).toString().equals("VARCHAR")) {
                        liste.put(rsmd.getColumnName(i), r.getString(rsmd.getColumnName(i)));
                    } else if (rsmd.getColumnTypeName(i).toString().equals("BIT")) {
                        liste.put(rsmd.getColumnName(i), r.getBoolean(rsmd.getColumnName(i)));
                    } else if (rsmd.getColumnTypeName(i).toString().equals("DOUBLE")) {
                        liste.put(rsmd.getColumnName(i), r.getDouble(rsmd.getColumnName(i)));
                    } else if (rsmd.getColumnTypeName(i).toString().equals("DATE")) {
                        liste.put(rsmd.getColumnName(i), r.getDate(rsmd.getColumnName(i)));
                    }
                }
                tabelle.put(aa, liste);
                System.out.println(tabelle.get(aa));
                aa++;
            }
        } catch (SQLException ex) {
            Logger.getLogger("global").log(Level.SEVERE, null, ex);
        }
 }


Danke Manuela
 
S

SlaterB

Gast
kleiner Tipp am Rande:
Code:
for (int i = 0; i <= rsmd.getColumnCount(); i++) { 
  String type = rsmd.getColumnTypeName(i).toString();
  String name = rsmd.getColumnName(i);

  if (type.equals("INTEGER") || 
      type.equals("INTEGER UNSIGNED") || 
      type.equals("TINYINT")) { 
               liste.put(name, r.getInt(name)); 
   } else ..
dann kann man es auch halbwegs lesen..

so, zu deinem Problem kann ich erstmal nichts genaues sagen, außer dem Tipp, mit System.out.println (oder anhand des StackTrace) festzustellen,
bei welchem i/ welchem Attribut das Problem auftritt,

dann dürfte EIN einzelner Aufruf
r.getDate("spalteX");
die gleiche Execption auslösen, schon deutlich klarer,

falls es niemand weiß, dann sammle weitere Infos:
poste die Anfrage (möglichst einfach, möglichst wenig Spalten, wenn der Fehler nicht auftritt, dann langsam mehr Spalten einbauen)
das Tabellenschema als SQL und eine Ausgabe der Metadaten (welche Spalten usw)

--------

ach, wahrscheinlich liegts einfach am
i <= rsmd.getColumnCount();

schreibe dort

i < rsmd.getColumnCount();

;)

(toller Titel 'Hashtable!' übrigens..)
 
M

Manuela

Gast
Hallo SlaterB,

jetzt funktioniert es,

Code:
 public void select_datenbank(String sql){ 
        try { 
            
            int aa=0; 
            Hashtable<Number, Hashtable<Object, Object>> tabelle =new Hashtable<Number, Hashtable<Object, Object>> (); 
            c = Konektor.Connector.getInstance().getConnection(); 
            java.sql.ResultSet r = null; 
            r = c.createStatement().executeQuery(sql); 
            ResultSetMetaData rsmd = r.getMetaData(); 
            while(r.next()) { 
                Hashtable<Object,Object> liste = new Hashtable<Object,Object>(); 
                for (int i = 0; i <= rsmd.getColumnCount(); i++) { 
                    try{
                    if (rsmd.getColumnTypeName(i).toString().equals("INTEGER") || 
                            rsmd.getColumnTypeName(i).toString().equals("INTEGER UNSIGNED") || 
                            rsmd.getColumnTypeName(i).toString().equals("TINYINT")) { 
                        liste.put(rsmd.getColumnName(i), r.getInt(rsmd.getColumnName(i))); 
                    } else if (rsmd.getColumnTypeName(i).toString().equals("VARCHAR")) { 
                        liste.put(rsmd.getColumnName(i), r.getString(rsmd.getColumnName(i))); 
                    } else if (rsmd.getColumnTypeName(i).toString().equals("BIT")) { 
                        liste.put(rsmd.getColumnName(i), r.getBoolean(rsmd.getColumnName(i))); 
                    } else if (rsmd.getColumnTypeName(i).toString().equals("DOUBLE")) { 
                        liste.put(rsmd.getColumnName(i), r.getDouble(rsmd.getColumnName(i))); 
                    } else if (rsmd.getColumnTypeName(i).toString().equals("DATE")) { 
                        liste.put(rsmd.getColumnName(i), r.getDate(rsmd.getColumnName(i))); 
                    } 
                    catch(Exception aaaa){
                       System.out.println(aaaa);      
                    }
                } 
                tabelle.put(aa, liste); 
                System.out.println(tabelle.get(aa)); 
                aa++; 
            } 
        } catch (SQLException ex) { 
            Logger.getLogger("global").log(Level.SEVERE, null, ex); 
        } 
}

habe der for schleife einen try catch gegeben dann kam die Felhermeldung
java.sql.SQLException: Column index out of range.
und dann füllte sich das Hashtable.

erstmal Danke an Dich.

Gruß Manuela
 
B

bygones

Gast
bei sql ist der anfangsindex nicht 0, sondern 1 !

daher wirft der zugriff rsmd.getColumnTypeName(0) zb einen Fehler

siehe zb http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSetMetaData.html#getColumnLabel(int)


ansonsten finde ich das ein bisschen merkwuerdiges konzept... allein Hashtable<Number, Hashtable<Object, Object>> find ich schon schaurig - aber naja
 
M

Manuela

Gast
Hallo SlaterB,

ich habe deine Tipps nicht ignorierst sondern auch umgesetzt.

Code:
   public void select_datenbank(String sql){
        try {
            System.out.println(sql);
            int aa=0;
            Auf_ersatz aufersatz =  Auf_ersatz.getInstance();
            Hashtable<Number, Hashtable<Object, Object>> tabelle =new Hashtable<Number, Hashtable<Object, Object>> ();
            c = Konektor.Connector.getInstance().getConnection();
            java.sql.ResultSet r = null;
            r = c.createStatement().executeQuery(sql);
            ResultSetMetaData rsmd = r.getMetaData();
            System.out.println("Column="+rsmd.getColumnCount());
            while(r.next()) {
                Hashtable<Object,Object> liste = new Hashtable<Object,Object>();
                for (int i = 0; i < rsmd.getColumnCount(); i++) {
                    try{
                        String type = rsmd.getColumnTypeName(i).toString();
                        String name = rsmd.getColumnName(i);
                        if (type.equals("INTEGER") ||
                                type.equals("INTEGER UNSIGNED") ||
                                type.equals("TINYINT")) {
                            liste.put(name, r.getInt(name));
                        } else if (type.equals("VARCHAR")) {
                            liste.put(name, r.getString(name));
                        } else if (type.equals("BIT")) {
                            liste.put(name, r.getBoolean(name));
                        } else if (type.equals("DOUBLE")) {
                            liste.put(name, r.getDouble(name));
                        } else if (type.equals("DATE")) {
                            liste.put(name, r.getDate(name));
                        }
                    } catch(Exception aas){
                        System.out.println(aas);
                    }
                    tabelle.put(aa, liste);
                    aa++;
                }
            }
            
            aufersatz.setTabelle(tabelle);
        } catch (SQLException ex) {
            System.out.println(ex);
            //     Logger.getLogger("global").log(Level.SEVERE, null, ex);
        }
        
}

ich hatte nur den alten code genommen :oops:

Gruß Manuela
 
B

bygones

Gast
meinen post wahrscheinlich noch nicht gelesen..

aber etwas generelles... nur weil etwas komisches passiert ist es keine gute praxis mal alle Exceptions abzufangen und die zu ignorieren...
 
M

Manuela

Gast
Hallo deathbyaclown,

da muß ich Dir recht geben,
auch dein tip habe ich jetzt umgestetz und bei 1 angefangen zu Zählen.
aber ich denke dass es in diesem Fall gar nicht verkehrt ist die Exceptions abzufangen weil, es auch vorkommen kann das es eine NullPointerException kommt, wenn der Datensatz den wert null(nicht die Zahl 0) hat.
ich hoffe du stimmst mir zu.
ich lasse mich auch gerne überzeugen wenn das nicht gut ist, weil nur so kann man etwas lehrnen.

Gruß Manuela
 
B

bygones

Gast
ich meinte nicht, dass man keine Exceptions abfangen soll - um himmels willen ;-)

aber

catch(Exception e)

ist schon meiner ansicht nach schlecht... wenn eine bestimmte Exception geworfen wird, nur die Abfangen. Also wenn du weisst dass eine SQLException geworfen wird, dann nur

catch(SQLException e)

und dann wuerde ich mir nicht einfach die Exception message ausgeben lassen, sondern immer den StackTrace (e.printStackTrace()), um den Fehler verfolgen zu koennen.


ABER

in deinem Fall wuerde ich es trotzem anders machen.. wenn du schon weisst, dass auch null existiert, so wuerde ich explizit das abfragen (also if(x == null)) oder so... bewusst exception schmeissen halte ich fuer gewagt... so ist sofort klar, dass ein solcher Fall auftreten kann.
 
M

Manuela

Gast
Hallo deathbyaclown,

natürlich gebe ich dir recht,
und ich habe beim Typ DATE denn nur dort können null vorkommen mit if !=null abgefangen und den try catch raus genommen.

der schnellste weg ist nicht immer der beste.

Danke Manuela
 

sparrow

Top Contributor
Achtung, mein Spruch des Monats:
Exceptions sind nichts schlimmes... solange man sie nicht ignoriert.
Trotzdem sollte in einem Fall wie diesem auf jeden Fall alles dafür getan werden, dass es zu keiner Exception kommt. Jede geworfene Exception sorgt für einen Einbruch der Leistung der VM.
Also so etwas Triviales wie ein NullPointer oder andere logische Fehler von vornerein ausschließen und es gar nicht erst zu einer Exception kommen lassen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben