C # ?? nullo coalescenza domanda operatore
-
26-09-2019 - |
Domanda
Ho definito Class persona immobili Compleanno DateTime nullable? , quindi perché non dovrebbe il nulla coalescenza lavoro operatore nel seguente esempio ?
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? DBNull.Value;
L'err compilatore ho ottenuto è stato "Operatore '??' non può essere applicato a operandi di tipo 'System.DateTime?' e 'System.DBNull'"
Di seguito anche avuto un errore di compilazione:
cmd.Parameters.Add(new SqlParameter("@Birthday",
SqlDbType.SmallDateTime)).Value =
(person.Birthday == null) ? person.Birthday:DBNull.Value;
Ho aggiunto un cast a (oggetto) come raccomandato dal refactoring, e compilato, ma non ha funzionato correttamente e il valore è stato memorizzato nel db SQLServer come nulla in entrambi i casi.
SqlDbType.SmallDateTime)).Value =
person.Birthday ?? (object)DBNull.Value;
qualcuno può spiegare che cosa sta succedendo qui?
avevo bisogno di utilizzare il seguente codice goffo:
if (person.Birthday == null)
cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value
= DBNull.Value;
else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value =
person.Birthday;
Soluzione
Il problema è che DateTime?
e DBNull.Value
non sono dello stesso tipo, quindi non è possibile utilizzare il nulla coalescenza operatore su di loro.
Nel vostro caso si può fare person.Birthday ?? (object)DBNull.Value
per passare un valore di tipo object
fino alla Add()
Altri suggerimenti
Io preferisco per scorrere i miei parametri poco prima di eseguire la query, cambiando tutte le istanze di nulla a DBNull a seconda dei casi, ad esempio:
foreach (IDataParameter param in cmd.Parameters)
if (param.Value == null)
param.Value = DBNull.Value;
Questo mi permette di lasciare i valori nulli così com'è e semplicemente scambiare in massa in seguito.
Il primo problema è che per la ??
o ?:
operatore, gli oggetti per entrambe le scelte devono essere dello stesso tipo. Eccoli diverso tipo.