# illegal operation on empty result set



## jim_panse (19. Aug 2009)

hey leute hab ein kleines projekt das ich zum laufen bringen soll, daten sollen aus einer *.txt datei ausgelesen und in eine mysql datenbank gespeichert werden, jedoch bekomme ich beim ausführen des programms immer die fehlermeldung:" illegal operation on empty result set"

als kleine hilfe hier meine methode in der die fehlermeldung auftritt


```
public void writeDB(String host, String user, String pswd, String schema, HashMap<String,DICOMValues> optMap) throws Exception{
        MySQLTranslator mySQLT = new MySQLTranslator();
        mySQLT.connect(host, user, pswd, schema);   //Verbindung mit dem MySQL-Server
        ResultSet rsID = null;                      //Initialisierung des ResultSets
        ResultSet rsIsEmpty = null;
        int rsStudy = 0;
        
        System.out.println("Initialisierung Resultset");

        Set<String> keySet = optMap.keySet();
        for (String act : keySet){
            
            String key = optMap.get(act).getDate() + optMap.get(act).getMod() + optMap.get(act).getDept();
            String modId = "";
            String uid = "";
            
            String isEmptyQuery = "SELECT * FROM study where uid = '" + key + "'";
            String modQuery = "SELECT id FROM modality where attribute = '" + optMap.get(act).getMod() + "' and department_attribute = '"+ optMap.get(act).getDept() +"'";
            
            rsIsEmpty = mySQLT.writeSELECTQuery(isEmptyQuery);
            if (rsIsEmpty.next()){
                uid = rsIsEmpty.getString("uid");
                
            }else{
                uid = "";
            }
            
            if(uid.equals("")){
                rsID = mySQLT.writeSELECTQuery(modQuery);
                rsID.next();
                modId = rsID.getString("id");
                
                String queryStudy = "insert into study (uid, modality_id, numstudy, numpic, datestudy) values ('" + key + "','" + modId + "', " + optMap.get(act).getNumstud() + ", " + optMap.get(act).getNumpic() + ", " + optMap.get(act).getDate() + ")";
                rsStudy = mySQLT.writeINSERTQuery(queryStudy);
            } else if(uid.equals(key)){
                rsID = mySQLT.writeSELECTQuery(modQuery);
                rsID.next();
                modId = rsID.getString("id");
                
                String queryStudy = "update study set modality_id='" + modId + "', numstudy="+optMap.get(act).getNumstud()+", numpic=" + optMap.get(act).getNumpic() + " where uid='" + key + "'";
                rsStudy = mySQLT.writeINSERTQuery(queryStudy);
            }
        }
        
        mySQLT.deConnect();
        
    }
```

kann es vielleicht daran liegen, dass in der datenbank in einer bestimmten tabelle schon etwas drin stehen muss?

m.f.g


----------



## sparrow (19. Aug 2009)

In welcher Zeile tritt der Fehler denn auf?


----------



## jim_panse (19. Aug 2009)

der fehler tritt auf sobald die methode writeDB aufgerufen wird.

aber da das System.out noch ausgegeben wird, fängt es glaube ich hier an:


```
Set<String> keySet = optMap.keySet();
        for (String act : keySet){
```

die fehlermeldungen werden in eine errorlog datei umgeleitet, wo man dann nur mehr sehen kann welcher fehler entstanden ist und nicht wo.

kann es sein, dass man in der datenbank in einer tabelle was ändern muss damit es geht ?


----------



## SlaterB (19. Aug 2009)

der Fehler dürfte in Zeile 30 oder 37 auftreten,
Grund ist jeweils, dass das SELECT nichts liefert und du ungeprüft davon ausgehst, das etwas vorhanden ist,

was die DB-Anfragen zu bedeuten haben kann man wohl kaum erraten,

ein Programm ohne Error-Logging, Debugging-Möglichkeiten oder System.out.println zu schreiben ist ja sehr selbstmörderisch

edit:
halt,
> aber da das System.out noch ausgegeben wird, fängt es glaube ich hier an:

wenn das doch geht, und du nur Exception unverständlicherweise nicht ausgibst,
dann schreibe notfalls zwischen jede Zeile
System.out.println("Zeile 1");
..
System.out.println("Zeile 2");
..
System.out.println("Zeile 3");
..

so findet man auch die Zeile des Fehlers..


----------



## sparrow (19. Aug 2009)

Was der Herr SlaterB dir damit sagen möchte:

Wenn du deine Exceptions nicht behandelst liegt den Fehler in Zeile 1.

```
throws Exception
```
muss da weg oder die Exception außerhalb der Methode vernünftig behandelt und ausgegeben werden.
Und der StackTrace der Exception sagt dir dann ganz, ganz genau in welcher Line das ganze ausgelöst wurde.


----------



## SlaterB (19. Aug 2009)

maki?


----------



## sparrow (19. Aug 2009)

Oooooooooh... mist
Ich mein natürlich den SlaterB.
Tschuldigung.

Ich werd alt... und blind... und fett....


----------



## maki (19. Aug 2009)

Wird hier über mich geredet?



> alt... und blind... und fett....


Offentsichtlich schon 

*g*


----------



## jim_panse (19. Aug 2009)

es geht bis zeile 21 danach wird nichts mehr ausgegeben

zur besseren übersicht noch mal der code:


```
if(uid.equals("")){
                System.out.println("ZEILE 19");
                rsID = mySQLT.writeSELECTQuery(modQuery);
                System.out.println("ZEILE 20");
                rsID.next();
                System.out.println("ZEILE 21");   // BIS HIER!
                modId = rsID.getString("id");
                System.out.println("ZEILE 22");
                String queryStudy = "insert into study (uid, modality_id, numstudy, numpic, datestudy) values ('" + key + "','" + modId + "', " + optMap.get(act).getNumstud() + ", " + optMap.get(act).getNumpic() + ", " + optMap.get(act).getDate() + ")";
                System.out.println("ZEILE 23");
                rsStudy = mySQLT.writeINSERTQuery(queryStudy);
              System.out.println("ZEILE 24");  
            } else if(uid.equals(key)){
                System.out.println("ZEILE 25");
                rsID = mySQLT.writeSELECTQuery(modQuery);
                System.out.println("ZEILE 26");
                rsID.next();
                System.out.println("ZEILE 27");
                modId = rsID.getString("id");
                System.out.println("ZEILE 28");
                String queryStudy = "update study set modality_id='" + modId + "', numstudy="+optMap.get(act).getNumstud()+", numpic=" + optMap.get(act).getNumpic() + " where uid='" + key + "'";
                System.out.println("ZEILE 29");
                rsStudy = mySQLT.writeINSERTQuery(queryStudy);
            }
        }
        
        mySQLT.deConnect();
```


----------



## SlaterB (19. Aug 2009)

habe ich schon gedacht und erwähnt und alle möglichen Folgerungen daraus auch hingeschrieben 
mehr Tipps kannst du also ohne weiteren Informationen von dir nicht bekommen


----------



## sparrow (19. Aug 2009)

Jau... genau das wollte ich verhindern.
Lern Exception-Handling. Sofort.

Ansonsten ist rsID vielleicht ein leeres ResultSet und die Abfrage in modQuery liefert demnach keine Zeilen.


----------



## jim_panse (19. Aug 2009)

o.k o.k ich habs jetz mit try catch um den ganzen block gemacht 

er wirft irgendeine sql exception und wenn ich auf den fehler klicke dann kommt diese zeile:


```
modId = rsID.getString("id");
```

das lustige is, wenn ich jetz in meine datenbank schau, stehn die werte aufeinmal drin so wie ich sie haben wollt 

find ich irgendwie seeeeeeeeeeeeeehr komisch

weil eigentlich sollte ja wenn er eine exception wirft schluss sein oda? 
jetz muss ich die also noch irgendwie wegbekommen... soweit ich das versteh steht in rsID oder in id nix drin.


----------



## sparrow (19. Aug 2009)

jim_panse hat gesagt.:


> o.k o.k ich habs jetz mit try catch um den ganzen block gemacht
> 
> er wirft irgendeine sql exception und wenn ich auf den fehler klicke dann kommt diese zeile:




Was verbirgt sich denn hinter "irgend eine sql exception".


----------



## SlaterB (19. Aug 2009)

Ignite Realtime: SQLException: Illegal operation on...


----------



## jim_panse (19. Aug 2009)

sry ^^

diese exception: 
	
	
	
	





```
java.sql.SQLException: Illegal operation on empty result set.
```


----------



## jim_panse (20. Aug 2009)

und bekomm ich jetz keinen beitrag mehr ?


----------



## SlaterB (20. Aug 2009)

Forumecho:


SlaterB hat gesagt.:


> habe ich schon gedacht und erwähnt und alle möglichen Folgerungen daraus auch hingeschrieben
> mehr Tipps kannst du also ohne weiteren Informationen von dir nicht bekommen


----------



## maki (20. Aug 2009)

jim_panse hat gesagt.:


> und bekomm ich jetz keinen beitrag mehr ?


Welche Frage ist denn noch offen?

Diese Exception hier

```
java.sql.SQLException: Illegal operation on empty result set.
```
sagt doch eindeutig dass du über ein leeres ResultSet iterieren willst.
Die Zeile kennst du auch schon, würde also mal das Select Statement korrigieren wenn es falsch ist oder damit rechnen dass es eben keine Ergebnisse geben kann.


----------



## jim_panse (20. Aug 2009)

die frage die noch offen ist, ist warum das programm eine exception wirft, aber trotz allem funktioniert so wie es sein sollte


----------



## maki (20. Aug 2009)

jim_panse hat gesagt.:


> die frage die noch offen ist, ist warum das programm eine exception wirft, aber trotz allem funktioniert so wie es sein sollte


Weil du die Fehler nicht siehst?


----------



## sparrow (20. Aug 2009)

Und der SlaterB hat auch schon weiter oben diesen Link gebracht: Ignite Realtime: SQLException: Illegal operation on...


----------



## SlaterB (20. Aug 2009)

das war nur für deine Nachfrage 'Was verbirgt sich denn hinter "irgend eine sql exception". ' 

warum die Exception kommt, wurde erklärt,

eine Erklräung, warum das Programm trotzdem mehr oder weniger funktioniert, ist etwas viel verlangt


----------

