# DB2 Express und JDBC



## spider_ (8. Aug 2006)

Hallo,

ich habe ein paar Probleme mit DB2 Express und dem JDBC Treiber der da mitgeliefert wird. Zum einen scheint der Treiber den NULL Typ nicht zu unterstützen. Jedesmal wenn ich etwas wie:

```
...
 PreparedStatement pst = con.prepareStatement("...");
 pst.setNull(1, Types.NULL);
 ...
```
mache, kommt eine Exception mit der Meldung, dass der Typ 0 nicht unterstützt wird. Aber NULL Werte sind in meiner Datenbank unerläßlich, die braucht jede normale Datenbank nunmal. 
Eine andere Sache, die ich mir leider auch nicht erklären kann, ist folgende: Ich setze in relativ kurzer Zeit (etwa jede Sekunde, aber nicht schneller) INSERT-Statements an die DB ab. Das funktioniert auch die erste Zeit. Doch nach einiger Zeit kommt eine SQLException mit folgender Meldung:

```
com.ibm.db2.jcc.a.SqlException: DB2 SQL error: SQLCODE: -805, SQLSTATE: 51002, SQLERRMC: NULLID.SYSLH203 0X5359534C564C3031
```
Der DB2 SQLState 805 hat folgende Bedeutung:

```
bash# db2 ? sql0805
SQL0805N Paket "<name-des-pakets>" nicht gefunden.  

Erklärung: 

Die Anweisung kann nicht beendet werden, da das erforderliche 
Paket im Katalog nicht gefunden wurde.  
 ...
```
Das seltsame dabei ist, dass die Exception erst nach einiger Zeit kommt - und die Anweisung sich ja nicht ändert. Das Programm scheint die Verbindung zur Datenbank "verloren" zu haben.
Hat jemand vielleicht eine Idee, woran das liegen könnte. Hab schon viel gegoogled, aber nichts gefunden, was mich weiter gebracht hat.
Vielen Dank schonmal
Eike


----------



## semi (8. Aug 2006)

Du musst schon den konkreten Typen des entsprechenden Parameters
verwenden.
z.B. bei einem Double-Parameter
	
	
	
	





```
pst.setNull(1, Types.DOUBLE);
```
Schreib dir am besten eine Hilfsklasse, die das ganze in der Anwendung vereinfacht bzw. verkürzt.
	
	
	
	





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

public static void setValue(PreparedStatement ps, int col, Double value) throws SQLException
{
  if (value == null)
    ps.setNull(col,Types.Double);
  else
    ps.setDouble(col,value.doubleValue());
}

usw. mit anderen Typen
```
Anwendung z.B.
	
	
	
	





```
int column = 1;
DBUtil.setValue(pst, column++, artikel.getBezeichnung());
DBUtil.setValue(pst, column++, artikel.getPreis());
```
Gleiches dann in umgekehrter Richtung, beim Lesen aus ResultSet.


----------



## spider_ (9. Aug 2006)

Ah, vielen Dank!!! 

Ich hatte mich nämlich auch schon gefragt, wieso ich denn bei der Methode setNull()  den Typ Types.NULL mit angeben muss... weil, steht ja schon da So ist das jetzt auch beantwortet ;-)
Ich hatte vor einiger Zeit mit MySQL zu tun, und da hat das wie oben beschrieben funktioniert.


Das andere Problem fühlt sich irgendwie auch gelöst an: Ich habe mal wieder über den Quellcode geschaut und festgestellt ( :roll: ) das ich da ganz schönen unsinn gemacht habe (viele dieser computer-probleme befinden sich halt zwischen tastatur und stuhl...). Die Methode, die auf der DB rummacht, erstellt jedes mal neu das PreparedStatement.... und die habe ich jede Sekunde mehrere Stunden lang aufgerufen, wodurch der Sinn des PreparedStatements dahin ist. Seit ich das geändert habe, ist die Fehlermeldung nicht mehr gekommen. Das Problem ist nur, dass sie halt auch vorher nicht immer kam, wodurch ich jetzt nicht zu 100% sagen kann, das es daran lag - ich denke aber, das es das war... werde davon berichten, falls sie nochmal auftaucht...  :?


----------

