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;
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top