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);

?

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.


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.


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.


9

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


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()

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.