L'applicazione che sto sviluppando recupera una serie di informazioni da una base di dati, comprese alcune date. Poiché i campi datetime nel database ammettono il valore null, per manipolare le date utilizzo il tipo Nullable<DateTime>, grazie al quale riesco facilmente a capire se nessuna data è stata specificata nella base di dati. Questo sistema ha però un problema. Supponiamo di dover aggiornare un campo datetime, inserendo al suo interno il valore null. Se io creo un oggetto SqlParameter di tipo SqlDbType.DateTime (con il parametro chiamato @dataScandenza) e imposto la sua proprietà Value su null, andando ad eseguire il metodo SqlCommand.ExecuteNonQuery si ottiene il seguente messaggio di errore:
The parameterized query '...' expects the parameter '@dataScadenza', which was not supplied.
Eppure il parametro è stato correttamente aggiunto all'oggetto SqlCommand. In questo caso il messaggio di errore è fuorviante: in realtà il parametro è stato specificato, ma il suo valore non è valido.
Per risolvere il problema, nel caso in cui si voglia inserire un valore null in un campo datetime di SQL Server, si deve ricorrere al valore SqlDateTime.Null. Per semplificare il tutto, ho definito una routine che prende in ingresso il nome del parametro, un oggetto di tipo Nullable<DateTime> e restituisce un SqlParameter impostato nel modo corretto:
private SqlParameter CreateDateTimeParameter(string parameterName, DateTime? date)
{
SqlParameter parameter = new SqlParameter(parameterName, SqlDbType.DateTime);
if (date.HasValue)
parameter.Value = date.Value;
else
parameter.Value = SqlDateTime.Null;
return parameter;
}
E il gioco è fatto