95 votes

PreparedStatement setNull(..)

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

prepStmt.setNull(parameterIndex, Types.VARCHAR);

La sémantique de cet appel est-elle la même que lorsqu'on utilise un setType spécifique avec un paramètre nul ?

prepStmt.setString(null);

?

82voto

Owen Points 191

Mais attention à ceci....

Long nullLong = null;

preparedStatement.setLong( nullLong );

-signale une exception de pointeur nul-

car le protype est

setLong( long )   

PAS

setLong( Long )

C'est bien de te faire sortir, hein.

0 votes

C'est d'ailleurs l'exemple qui m'a amené ici.

0 votes

Dans ce cas (en utilisant une BD Postgres dans mon cas), vous pouvez utiliser la méthode setObject. Long nullLong = null; preparedStatement.setObject(nullLong);

77voto

djna Points 34761

Ce site guide dit :

6.1.5 Envoi de JDBC NULL comme paramètre IN

El setNull permet au programmeur d'envoyer un message JDBC NULL (un SQL générique NULL ) à la base de données en tant que paramètre IN. Notez cependant que vous devez toujours spécifier le type JDBC du paramètre.

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

Donc oui, ils sont équivalents.

2 votes

+1 : Intéressant. Je pensais que c'était comme ça que setXXX fonctionnait avec les valeurs nulles, mais je ne l'avais jamais testé ou lu dans la documentation.

2 votes

Je suppose qu'il n'existe pas quelque chose comme myPreparedStatement.setInteger(myIntegerObject) (bien que je vois que ce nom de méthode exact n'existe pas) dans le cas où je veux utiliser un entier potentiellement nul ? Sinon, je vais devoir utiliser une instruction if/else, appeler .setInt() dans un sens et .setNull() dans l'autre, ce qui semble un peu fastidieux.

0 votes

@ardave, oui c'est ce que je veux dire par mon dernier paragraphe

14voto

paweloque Points 4467

Finalement, j'ai fait un petit test et pendant que je 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.

10voto

bithom Points 176

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

10voto

preparedStatement.setNull(index, java.sql.Types.NULL);

qui devrait fonctionner pour n'importe quel type. Bien que dans certains cas, l'échec se produise du côté du serveur, par exemple : pour SQL :

COALESCE(?, CURRENT_TIMESTAMP)

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

En résumé : il est bon de connaître le type si vous appelez .setNull()

UPDATE : stackoverflow a besoin d'embaucher plus de rédacteurs pour ajouter \remove la ponctuation de mes messages ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X