# Rückgabe ob INSERT erfolgreich



## chuvak (25. Feb 2010)

Im View übergebe ich dem Model den Befehl, etwas in die Datenbank zu schreiben:

```
db.eintragen(tf1.getText(), tf2.getText());
```
Je nach dem, ob der INSERT erfolgreich war, möchte ich im View gerne eine Meldung ausgeben. Z.B. so:

```
meldung.setText("Eintrag erfolgreich");
```

Wie kann ich im View also gleich überprüfen, ob der INSERT erfolgreich war oder nicht?

Bei PHP gibt es sowas:

```
if(mysql_query(...))
{
   echo "Eintrag erfolgreich";
}
else
{
   echo "Eintrag NICHT erfolgreich";
}
```


----------



## Michael... (25. Feb 2010)

Wenn Du für Dein Insert executeUpdate() von PreparedStatement oder Statement nimmst, kriegst Du sogar die Anzahl der eingefügen Datensätze zurück.


----------



## bronks (25. Feb 2010)

chuvak hat gesagt.:


> ... Wie kann ich im View also gleich überprüfen, ob der INSERT erfolgreich war oder nicht? ...


Wenn beim Insert etwas schief geht, dann kassierst Du eine Exception.


----------



## chuvak (25. Feb 2010)

Ich verwende ja das MVC-Prinzip. Da hat man vom Model keinen Zugriff auf die anderen Komponente (View). Ich darf also beim Einfügen in die Datenbank vom Model nicht auf die View zugreifen und irgendwas übergeben.
Das heißt, ich muss explizit aus dem View überprüfen, ob das Model erfolgreich seine Arbeit getan hat.

Bitte korrigiert mich, wenn ich falsch liege.


----------



## The_S (25. Feb 2010)

Die Exception musst du natürlich in Form von "throws" oder eines entsprechenden Rückgabewerts weiterleiten.


----------



## chuvak (25. Feb 2010)

The_S hat gesagt.:


> Die Exception musst du natürlich in Form von "throws" oder eines entsprechenden Rückgabewerts weiterleiten.



Das klingt interessant. Könntest du evtl. ein kleines Beispiel posten?
Wie kann man vom Model ans View etwas übergeben? Laut MVC geht das ja nicht.


----------



## The_S (25. Feb 2010)

Irgendwas muss das GUI-Event ja abgefangen, interpretiert/konvertiert, und über irgendeinen Weg die Modell-Methode ausgeführt haben. Von daher funktioniert der Weg mit einem Rückgabewert oder einer geworfenen Exception auch Rückwärts, ohne dass das Model seinen Aufrufer kennt.


----------



## Michael... (25. Feb 2010)

Meine Meinung:
Nach MVC würde auch nicht das Model Änderungen an der Datenbank vornehmen geschweige denn die DB überhaupt kennen.
Änderungen an der Datenbank würde der Controler vornehmen, z.B. nach dem er vom Model über Änderungen der Daten informiert wurde.


----------



## The_S (25. Feb 2010)

Ja, MVC ist immer so ne Interpretationssache und wie weit man es wirklich treiben will ...


----------



## daNny (25. Feb 2010)

Also: Normalerweise würde ich sagen, dass die View dem Controller sagt, dass der Benutzer etwas ausgeführt hat. Dieser übersetzt die Aktion dann für das Model und ruft die entsprechende Methode dort auf. 
Das Model führt die Methode aus, und kann nun unterschiedlich reagieren. Wenn der Controller z.B. sagte: *model.getAllData*, dann kann es direkt an den Controller per Rückgabewert liefern. Das Model kann aber auch als Observer fungieren, und allen seinen Listenern sagen: Ich habe dies und das getant. Dann müsste man halt Komponenten beim Model als Listener hinzufügen. Beim einen ist das direkt die View, bei den anderen der Controller.
Ich personlich registriere lieber den Controller beim Model, und wenn dieses dann eine Änderung meldet, übersetzt er diese wieder für die View.
Gibt halt mehrere Interpretationsmöglichkeiten...

Java SE Application Design With MVC
Das finde ich ziemlich ausführlich beschrieben


----------



## Michael... (25. Feb 2010)

Sicherlich könnte man das auch so implementiert, dass nur das Model die Datenbank kennt und Änderungen am Model sofort in die Datenbank zurückgeschrieben werden.
Aber aufgrund der Zeile:


> db.eintragen(tf1.getText(), tf2.getText());


würde ich sagen, es wird ja Information aus der View in die Datenbank übertragen, d.h. der Controler ist ja eh involviert.


----------



## chuvak (25. Feb 2010)

Ich denke, ich habs jetzt.
Das ist in meinem Model:

```
privat Boolean erg;

public Boolean eintragen(String mein_name, String mein_inhalt) {
        try {
            befehl.execute("INSERT into anekdot_tb (name, inhalt) values ('" + mein_name + "',  '" + mein_inhalt+ "')");
            erg=true;

        } catch (Exception e) {
            erg=false;
        }
        return erg;
    }
```
Die Funktion selbst gibt einfach einen Rückgabewert, was vom View verarbeitet wird. Die Lösung ist einfacher, als ich dachte.

Dankeschön an alle Beteiligten!


----------

