PreparedStatement setNull (..)


88

Java PreparedStatement offre la possibilità di impostare esplicitamente un valore Null. Questa possibilità è:

prepStmt.setNull(parameterIndex, Types.VARCHAR);

La semantica di questa chiamata è la stessa di quando si utilizza un setType specifico con un parametro null?

prepStmt.setString(null);

?

Risposte:


76

Questa guida dice:

6.1.5 Invio di JDBC NULL come parametro IN

Il metodo setNull consente a un programmatore di inviare un valore NULL JDBC (un NULL SQL generico) al database come parametro IN. Notare, tuttavia, che è comunque necessario specificare il tipo JDBC del parametro.

Un JDBC NULL verrà anche inviato al database quando un valore null Java viene passato a un metodo setXXX (se accetta oggetti Java come argomenti). Il metodo setObject, tuttavia, può assumere un valore nullo solo se viene specificato il tipo JDBC.

Quindi sì, sono equivalenti.


2
+1: interessante. Supponevo che fosse così che setXXX funzionava con i null, ma non l'avevo mai testato o letto la documentazione.
Powerlord

2
Non suppongo che ci sia qualcosa come myPreparedStatement.setInteger (myIntegerObject) (anche se vedo che il nome del metodo esatto non esiste) nel caso in cui desidero utilizzare un numero intero potenzialmente nullo? Altrimenti dovrò usare un'istruzione if / else, chiamando .setInt () in un modo e .setNull () nell'altro, il che sembra un po 'noioso.

@ardave, sì, è quello che intendo con il mio ultimo paragrafo
djna

1
So che è vecchio ma quel collegamento è rotto.
Moob

1
Nuovo collegamento: PreparedStatement
candidus

77

ma attenzione a questo ...

Long nullLong = null;

preparedStatement.setLong( nullLong );

-questa eccezione del puntatore nullo-

perché il prototipo è

setLong( long )   

NON

setLong( Long )

bello per prenderti fuori eh.


Questo è in realtà l'esempio che mi ha portato qui.
sf_jeff

13

Alla fine ho fatto un piccolo test e mentre lo programmavo mi è venuto in mente che senza il metodo setNull (..) non ci sarebbe stato modo di impostare valori nulli per le primitive Java. Per gli oggetti in entrambe le direzioni

setNull(..)

e

set<ClassName>(.., null)) 

comportarsi allo stesso modo.


10

Potresti anche considerare di usare preparedStatement.setObject(index,value,type);


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

dovrebbe funzionare per qualsiasi tipo. Sebbene in alcuni casi si verifichi un errore sul lato server, come: per SQL:

COALESCE(?, CURRENT_TIMESTAMP)

Oracle 18XEfallisce con il tipo sbagliato: atteso DATE, ottenuto STRING- questo è un fallimento perfettamente valido;

In conclusione: è bene conoscere il tipo se chiami .setNull()

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.