Il capitolo 5 del Self-Paced Training Kit per l'esame 70-529 spiega come creare il client di un'applicazione che sfrutta il remoting. A pagina 174 si dice che, per utilizzare un canale TCP nel client, si deve istanziare un oggetto di tipo TcpServerChannel; analogamente, nella pagina successiva di dice che la classe IpcServerChannel serve per creare un canale IPC. In realtà, gli oggetti da utilizzare sono, rispettivamente, TcpClientChannel e IpcClientChannel. Per fortuna (almeno questa volta...), gli esempi di codice sono corretti.
Technorati tags:
Certification
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 