# BatchStatements - Definition Rückgabewerte



## Reth (24. Jun 2004)

Hallo nochmals,

kennt sich jemand gut mit Batchstatements aus?

Habe für die IBM DB2 V7.1 (glaub) ne Reihe Inserts als PreparedStatement angelegt und mit addBatch in ner Schleife gespeichert.
Wenn ich den Batch ausführen lasse, kommt kein Ergebnis zurück, aber ich bekomme ne BatchUpdateException.
Mittels des getUpdateCounts() habe ich erfahren, dass die Anzahl der Elemente im Ergebnis des getUpdateCounts() die gleiche ist, wie die Anzahl der Statements, die in den Batch eingefügt wurden (alles Inserts).

Nun habe ich hier http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html gelesen, dass man im Programm JDBC-Treiber unterscheiden kann, die beim Auftreten eines Fehlers bei der Batchbearbeitung abbrechen und solche die weitermachen. Bei letzteren enthält das Feld, das von getUpdateCounts() geliefert wird einen Eintrag für jedes Element im Batch (wie es bei mir der Fall ist).

Ausserdem bekomme ich im Feld von getUpdateCounts() für jedes Element eine -3 geliefert, was laut obiger Seite auch nur Treiber liefern, die alle Elemente im Batch ausführen, auch wenn ein Fehler zwischendrin durch eines der Elemente auftritt.

Daher gehe ich mal davon aus, dass der Treiber alle Elemente im Batch immer ausführt (das brauch ich nämlicha auch!).
Was mich aber irritiert ist, dass für jedes Element im Batch eine -3 als Ergebnis geliefert wird, obwohl von 1047 Inserts 1030 in der Datenbank gelandet sind!?

Woher kommt das denn? Wie bekomme ich heraus (in der Anwendung), wieviele Datensätze erfolgreich bearbeitet wurden wenn eine SQL-/BatchUpdateException auftaucht?

Weiss das zufällig jemand?

Danke schon mal
Ciao


----------



## nollario (24. Jun 2004)

rückgabewerte von jdbc calls sind tricky... und ausserdem treiber abhängig... bei stored procedures (CallableStatement) ist das dann noch gravierender....

was mich irritiert ist allerdings -3.... das macht doch gar keinen sinn, oder... kannst du evtl etwas code posten?


----------



## Reth (24. Jun 2004)

OK, ich stückel hier mal ein bisschen was zusammen und hoffe, dass es ausreicht, in den Kommentaren geb ich noch ein bisschen Info, was so passiert.
Evtl. sind Syntaxfehler o.ä. drin, da ich einige Teile direkt hier getippt habe, ohne compile vorher.


```
rs = (ResultSet)stmt.executeQuery(sql);
while (rs.next())
{
            // Resultsetwerte auslesen und in PreparedStatement setzen

	    insertEquipmentTextsStmt.setString(1, ...);
	    insertEquipmentTextsStmt.setString(2, ...);
	    .
            .
            .
                int counter = 0;
		try
		{
			insertEquipmentTextsStmt.addBatch();
			counter++;
		} catch (SQLException sqle)
		{
		    ...
		}
    }
}
rs.close();

try
{
	int results[] = insertEquipmentTextsStmt.executeBatch();
	Log.log(this, "INSERTED: " + results.length, "");
} catch (SQLException sqle)
{
	if (sqle instanceof BatchUpdateException)
	{
		System.out.println"FEHLER! EINGESTELLT: " + counter + " ERGEBNISSE: " +              
                                ((BatchUpdateException)sqle).getUpdateCounts().length);
                for (int i=0; i<((BatchUpdateException)sqle).getUpdateCounts().length; i++)
                {
                        System.out.println("ERGEBNIS AN STELLE: " + i + " IST " + 
                                                    ((BatchUpdateException)sqle).getUpdateCounts()[i]);
                }
	}
}
```

Im oberen System.out.println steht dann, dass 1047 Einträge eingestellt worden und 1047 Ergebnisse vorliegen!
In der Schleife wird für jedes Ergebnis der Wert -3 ausgegeben, obwohl 1030 Werte korrekt in die DB übernommen wurden (hab sie vorher gelöscht).


----------

