# updateXXX() nur mit Primärschlüssel?



## netz-rack.c (3. Mai 2007)

Hallo,

ich habe ein Result Set das durch mehrere Joins erstellt wurde. Jetzt versuche ich ein Update an mit updateInt() zu machen. Leider führt das sofort zu einer innerException (das ganze läuft n seinem eigenen Thread, daher (?) bekomme ich auch keine Fehlermeldungen, es funktionier nur nicht).
Natürlich rufe ich rs.updateRow(); am Ende auf.

Beim Debuggen mit Eclipse fiel mir auf, dass, obwohl ich das Result Set mit ResultSet.CONCUR_UPDATABLE erstellt habe, der Wert updateable auf false steht.

Hier einmal der Queltext des Update:


```
private void updateWerk(Werk tWerk) throws SQLException{
			int count = 0;
			
			ResultSet rs = getResultFromDB(tWerk.getId(), true);
			
			if(!rs.next())
				throw new SQLException("Updateversuch bei nichtvohandenem Werk!!!");
			
						
			if(!rs.getString("titel").equals(tWerk.getTitel())){
				rs.updateString("titel", tWerk.getTitel());
				count ++;
			}
			
			...
			
			if(rs.getInt("inventar") != tWerk.getInventar()){
				rs.updateInt("inventar", tWerk.getInventar());
				count ++;
			}
			
			
			if(count > 0)
				rs.updateRow();
```

Die Funktion die das Statement bereitstellt ist in die Umgebende Klasse ausgelagert, da die anderen (lesende / erzeugende) Klassen auch auf das Statement zugreifen können:


```
private ResultSet getResultFromDB(int Werk_id, boolean updatable) throws SQLException{
		
		int updateStat;
		if(updatable)
			updateStat = ResultSet.CONCUR_UPDATABLE;
		else
			updateStat = ResultSet.CONCUR_READ_ONLY;
				
		Statement s = Util.getBDB().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, updateStat);
		
		ResultSet rs = s.executeQuery("" +
				" SELECT" +
				"  w.jahr ," +
				"  w.titel ," +
				"  w.breite ," +
				"  w.beschreibung ," +
				"  w.versicherungswert ," +
				"  w.hoehe," +
				"  w.kuenstler_id," +
				"  w.standort_id," +
				"  w.besitzer_id," +
				"  w.werktechnik_id," +
				"  w.stdabb_id," +
				"  w.inventar," +
				"  f.data" +

				" FROM" +
				"  "+DB_SCHEMA+".werk AS w" +
				" LEFT JOIN" +
				"  "+DB_SCHEMA+".abbildung AS a ON w.stdabb_id = a.abb_id" +
				" NATURAL LEFT JOIN" +
				"  "+DB_SCHEMA+".vorhandene_versionen AS v" +
				" LEFT JOIN" +
				"  "+DB_SCHEMA+".foto AS f USING(foto_id)" +

				" WHERE" +
				"  w.werk_id = "+ Werk_id +

				"  ORDER BY" +
				"  abs(f.hoehe-300)+abs(f.breite-300)" +

				" LIMIT 1" );
		return rs;
	}
```


In der Postgresql-JDBC Dokumentation (Wikibook) habe ich gelesen, dass ich einen Primärschlüssel brauche, damit das ResultSet updateble ist. Ist das ein Weg? Wenn ja wie??


Irgendwie steh ich auf dem Schlauch. Vlt könnt ihr mir runterhelfen ?  

MfG
Carsten


----------



## Guest (3. Mai 2007)

Falls das ResultSet nicht updatable ist, sollte beim Aufruf einer der Update-Methoden eine Exception kommen.
Sind alle Primary-Key-Felder in der Abfrage dabei? Wenn nicht, dann füge die noch ein.


----------



## netz-rack.c (4. Mai 2007)

Das Problem ist, ich erhalte durch die Verschahtellung in einen SwingWorker Thread keine Fehlermeldung. Nur Eclipse hält an mit Local variable not available

Wenn es eine Fehlermeldung gibt, dann kommt sie irgndwie icht zu mir durch!


----------



## Guest (4. Mai 2007)

Fange die Exception einfach mal zum Test ab und gebe sie auf die Console aus, dann weisst du woran 
es scheitert.
	
	
	
	





```
catch(SQLException e)
{
  e.printStackTrace();
}
```


----------

