PreparedStatement setNull (..)

86

Java PreparedStatement offre la possibilité de définir explicitement une valeur Null. Cette possibilité est:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

La sémantique de cet appel est-elle la même que lors de l'utilisation d'un setType spécifique avec un paramètre nul?

prepStmt.setString(null);

?

paweloque
la source

Réponses:

73

Ce guide dit:

6.1.5 Envoi de JDBC NULL en tant que paramètre IN

La méthode setNull permet à un programmeur d'envoyer une valeur JDBC NULL (une valeur SQL générique NULL) à la base de données en tant que paramètre IN. Notez cependant qu'il faut toujours spécifier le type JDBC du paramètre.

Un JDBC NULL sera également envoyé à la base de données lorsqu'une valeur Java null est transmise à une méthode setXXX (si elle prend des objets Java comme arguments). La méthode setObject, cependant, ne peut prendre une valeur nulle que si le type JDBC est spécifié.

Alors oui, ils sont équivalents.

djna
la source
2
+1: Intéressant. J'ai supposé que c'était ainsi que setXXX fonctionnait avec les valeurs nulles, mais je ne l'avais jamais testé ni lu la documentation.
Powerlord
2
Je ne suppose pas qu'il y ait quelque chose comme myPreparedStatement.setInteger (myIntegerObject) (bien que je vois que le nom exact de la méthode n'existe pas) dans le cas où je voudrais utiliser un entier potentiellement nul? Sinon, je vais devoir utiliser une instruction if / else, en appelant .setInt () dans un sens et .setNull () dans l'autre sens, ce qui semble un peu fastidieux.
@ardave, oui c'est ce que j'entends par mon dernier paragraphe
djna
1
Je sais que c'est vieux mais ce lien est rompu.
Moob
1
Nouveau lien: PreparedStatement
candidus
76

mais attention à ça ...

Long nullLong = null;

preparedStatement.setLong( nullLong );

-thows exception de pointeur nul-

parce que le protype est

setLong( long )   

NE PAS

setLong( Long )

gentil pour vous attraper hein.

Owen
la source
C'est en fait l'exemple qui m'a amené ici.
sf_jeff
13

Finalement, j'ai fait un petit test et pendant que je le programmais, il m'est venu à l'esprit que sans la méthode setNull (..), il n'y aurait aucun moyen de définir des valeurs nulles pour les primitives Java. Pour les objets dans les deux sens

setNull(..)

et

set<ClassName>(.., null)) 

se comportent de la même manière.

paweloque
la source
9

Vous pouvez également envisager d'utiliser preparedStatement.setObject(index,value,type);

bithom
la source
4
preparedStatement.setNull(index, java.sql.Types.NULL);

cela devrait fonctionner pour n'importe quel type. Bien que dans certains cas, l'échec se produit côté serveur, comme: pour SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEéchoue avec le mauvais type: attendu DATE, obtenu STRING- c'est un échec parfaitement valide;

Bottom line: il est bon de connaître le type si vous appelez .setNull()

Dmitriy Pichugin
la source