# Update mit null



## Samson_Miller (1. Nov 2007)

Ich habe ein Eigebabefeld in das der Benutzer einen Wert eigeben kann, er kann das Feld aber auch leer lassen. Dieser Wert soll dann in der DB per Update gespeichert werden. Wenn der Benutzer nichts eingegeben hat, dann soll auch nichts in der DB gespeichert werden.

Ich arbeite mit PreparedStatement. Wie bekomme ich das jetzt hin, dass das update-statement:


```
UPDATE tabelle SET name=null;
```

an die Datenbank schickt, wenn der Benutzer in das Eingabefeld "name" nichts eingegeben hat?


----------



## SlaterB (1. Nov 2007)

was genau ist die Frage?
wie du das Statement formulierst oder wie von der GUI aus die ganze Sache anstößt oder oder?

soll wirklich in der ganzen Tabelle der Name gelöscht werden?


----------



## Samson_Miller (1. Nov 2007)

Das Statment sieht am Anfang folgendermaßen aus:


```
PreparedStatement ppSt = connection.prepareStatement("UPDATE tabelle SET name=?");
ppSt.setString(1,value); //value ist die Eingabe des Benutzers
ppSt.executeUpdate();
```

in value steht die Eingabe des Benutzers. Wenn der Benutzer in das Eingabefeld "Maik" eingibt, dann soll das Update-Statement folgendermaßen aussehen:


```
UPDATE tabelle SET name='Maik';
```

Wenn der Benutzer das Eingabefeld leer lässt, dann soll das update-Statement folgendermaßen aussehen:


```
UPDATE tabelle SET name=null;
```

wenn ich 


```
ppSt.setString(1,null);
```

schreibe, dann bekomme ich eine exception. Meine Frage ist nun, wie kann ich dem Statement ein null übergeben kann.


----------



## SlaterB (1. Nov 2007)

und, was funktioniert daran mit deinem bisherigen Code nicht?

falls das TextField bei Nichteingabe statt null eher "" zurückgibt, 
dann ist das ja einfach zu ändern,

falls 
ppSt.setString(1,null);
nicht den gewünschten Effekt hat oder verboten ist, dann musst du diesen Spezialfall eben mit if/ else abfangen und direkt einen String "UPDATE tabelle SET name=null" verwenden

das sind doch alles einfache Gedanken,
oder was genau ist das tatsächliche Problem?
ein drittes Mal möchte ich bitte nicht nachfragen müssen.. 

edit:
> dann bekomme ich eine exception. Meine Frage ist nun, wie kann ich dem Statement ein null übergeben kann

ah, ok, eine Info,
dazu habe ich ja ein bisschen geschrieben,
obs anders geht, kann ich persönlich nicht sagen


----------



## Samson_Miller (1. Nov 2007)

mit 

ppSt.setString(1,null); 

geht das leider nicht, und das Abfrage mit if/else ist mir zu aufwändig, ich dachte, da gibt es vielleicht eine bessere Lösung, dem PreparedStatement ein null zu übergeben.


----------



## Guest (1. Nov 2007)

```
ppSt.setNull(1, Types.VARCHAR);
```


----------



## SlaterB (1. Nov 2007)

nur ganz nebenbei:
hättest du im ersten Posting überflüssige Details wie 'Eingabefeld in das der Benutzer einen Wert eigeben kann' nicht erwähnt,
sondern direkt gesagt:

Ziel:
UPDATE tabelle SET name=?;  als PreparedStatement,

ppSt.setString(1,null); geht nicht,
+
if (nullValue) {
UPDATE tabelle SET name= null;
} else {
UPDATE tabelle SET name=?;
ppSt.setString(1,name);
}
ist nicht gewünscht (was du alles schon wusstest),
dann wären die ersten 4 unnötigen Antworten gar nicht erst gekommen 

--------


ach und dann sehe ich noch

void setNull(int parameterIndex, int sqlType) 
          Sets the designated parameter to SQL NULL. 

in der API


----------



## Samson_Miller (1. Nov 2007)

das void setNull(int parameterIndex, int sqlType)  ist mir auch aufgefallen, leider kann ich damit nicht null übergeben sondern z.B. 0, oder ander integer.


----------



## SlaterB (1. Nov 2007)

grummel, das kanntest du auch schon? 

so und wieso willst du da null übergeben?
ppSt.setNull(1, Types.VARCHAR);
wie Gast schon geschrieben hat,
ein kleines if/ else muss dann natürlich schon sein


----------



## Guest (1. Nov 2007)

Samson_Miller hat gesagt.:
			
		

> das void setNull(int parameterIndex, int sqlType)  ist mir auch aufgefallen, leider kann ich damit nicht null übergeben sondern z.B. 0, oder ander integer.


Der erste Parameter von setNull ist Index des Parameter in PreparedStatement, der zweite der Typ. Nix 0. 

Schreib dir am besten eine Hilfsklasse, nennen wir sie mal DBUtil, die folgende Methoden enthält.


```
public static void setValue(int index, PreparedStatement stmt, String value) throws SQLException
{
   if( value != null )
      stmt.setString(index, value);
   else
      stmt.setNull(index, Types.VARCHAR);
}

public static void setValue(int index, PreparedStatement stmt, Integer value) throws SQLException
{
   if( value != null )
      stmt.setInt(index, value.intValue());
   else
      stmt.setNull(index, Types.INTEGER);
}

usw.
```


----------



## Samson_Miller (1. Nov 2007)

Ich möchte null übergeben, damit in der Datenbank in der Spalte dann nichts steht.


----------



## Guest (1. Nov 2007)

Samson_Miller hat gesagt.:
			
		

> Ich möchte null übergeben, damit in der Datenbank in der Spalte dann nichts steht.


 :bahnhof:


----------

