# batchupdate, es wird nur der letzte Eintrag eingetragen



## nieselfriem (1. Sep 2011)

Hallo!

In meiner Einfügemethode wird eine ArrayListe vom Typ BewerberBeruf übergeben. Die Daten dieser Liste sollen durch eine Schleife und mit einem Batchupdate in die Datenbank eingefügt werden. Die Daten in der Liste kommen auch so weit an, jedoch wird immer nur der letzte Eintrag der ArrayListe in die Datenbank eingetragen. Das heißt für mich, es gibt eine Fehler in meine Programmierung des Batchupdates. Bisher kann ich ihn jedoch nicht so richtig eingrenzen. Bitte werft mal ein Auge auf meine Methode. Vielleicht könnt ihr mir den Fehler zeigen. Danke!


```
public boolean addBatch(ArrayList<BewerberBeruf> bewBer) throws SQLException, ClassNotFoundException {
        int[] updateCount = null;
        boolean isUpdated = false;
        conn = AllowConnect.driver(this.user, this.password, this.dburl, this.className);
        for (int i = 0; i < bewBer.size(); i++) {
                     stmt = conn.prepareStatement("INSERT INTO `Arbeitnehmer-Berufe` "
                            + "(`Arbeitnehmer-Berufe`.`AN-ID`, "
                            + "`Arbeitnehmer-Berufe`.`Wertigkeit`, "
                            + "`Arbeitnehmer-Berufe`.`Beruf`, "
                            + "`Arbeitnehmer-Berufe`.`Spez`) "
                            + "VALUES (?,?,?,?)");
                    stmt.setInt(1, bewBer.get(i).getBewBerufPId());
                    stmt.setInt(2, bewBer.get(i).getWertigkeit());
                    stmt.setString(3, bewBer.get(i).getBeruf());
                    stmt.setString(4, bewBer.get(i).getSpez());
                    stmt.addBatch();
                }
                    updateCount = stmt.executeBatch();
                    conn.commit();
                    if (updateCount.length > 0) {
                        isUpdated = true;
                        System.out.println("Updatecount"+updateCount.length);
                    }//if
                    //stmt.executeUpdate();
    
            } catch (BatchUpdateException e) {
                e.printStackTrace();
                conn.rollback();
                return false;
            }

        }//if
        conn.close();
        return isUpdated;
    }//addBatch
```


----------



## SlaterB (1. Sep 2011)

gib doch in der Java-Schleife und davor erstmal aus, wie groß die Size der Liste ist, 
und vorallem dann alle Werte pro i, vielleicht sind es immer dieselben, ein häufiger Fehler,

ansonsten vereinfachen, gehe auf eine Testtabelle, gehe auf ein einzelnes Attribut, speichere nur den Wert i, das macht die Liste überflüssig,
verzichte temporär komplett auf die Schleife und schreibe einfach nur 2x hintereinander

stmt.setString(1, "test1");
stmt.addBatch();
stmt.setString(1, "test2");
stmt.addBatch();

usw., immer arbeiten wenn noch direkt möglich, 
nicht nur ein großes Programm posten und fragend davor stehen


edit:
oh Mist, das nächste Post enthält natürlich einen besserer Fund


----------



## parabool (1. Sep 2011)

Das du das PreparedStatement in der Schleife immer wieder aufbaust kommt mir spanisch vor...


Edit: Aha, das Statement wird immer wieder aufgebaut - das letzte gewinnt


----------



## nieselfriem (1. Sep 2011)

SlaterB hat gesagt.:


> gib doch in der Java-Schleife und davor erstmal aus, wie groß die Size der Liste ist,
> und vorallem dann alle Werte pro i, vielleicht sind es immer dieselben, ein häufiger Fehler,



dies habe ich bereits getan.

```
for (int i = 0; i < bewBer.size(); i++) {

              System.out.println("In Addbatch "+bewBer.get(i).getBeruf() + "," + bewBer.get(i).getSpez() + "," + bewBer.get(i).getWertigkeit());
         }
```
Es kommen alle werte so an wie sie sollen.

Diesen Fehler kann ich also ausschliessen.

Gruß niesel


----------



## SlaterB (1. Sep 2011)

jaja, parabool hat besser geschaut


----------



## nieselfriem (1. Sep 2011)

thx an parabool und SlaterB. Das war es. Danke!


----------

