Come indicato nel precedente post http://brokenpipe-it.blogspot.com/2011/05/sqlite-equivalent-isnull-statement.html la corrispondente sintassi "isnull" è ifnull(x,y) ma si presenta un problema nell'esecuzione del metodo Executequery di Activerecordmediator con query scalare; vediamo un esempio:
string hql = "SELECT SUM(p.Pz) FROM PackingDetails p " +
"WHERE p.Id_packing = :parIdPack "
ScalarQuery q = new ScalarQuery(typeof(PackingDetails), hql);
q.SetParameter("parIdPack", IdPack);
long totalPz = ActiveRecordMediator.ExecuteQuery(q);
return Convert.ToInt32(totalPz);
Nel caso in cui la condizione indicata dalla clausola where non sia verificata ci aspetteremo in uscita 0, ma in realtà ci troveremo , invece, una SystemNullException.
Per ovviare al problema risolviamo così:
try {
string hql = "SELECT SUM(p.Pz) FROM PackingDetails p " +
"WHERE p.Id_packing = :parIdPack " +
ScalarQuery q = new ScalarQuery(typeof(PackingDetails), hql);
q.SetParameter("parIdPack", IdPack);
long? totalPz = (long?)ActiveRecordMediator.ExecuteQuery(q);
return Convert.ToInt32((totalPz.HasValue) ? totalPz : -1);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return -1;
}
long? totalPz =(long?)ActiveRecordMediator.ExecuteQuery(q);
informerà il compilatore che la variabile totalPz non dovrà obbligatoriamente essere valorizzata e quindi poi utilizzeremo
((totalPz.HasValue) ? totalPz : -1)
per ritornare totalPz se valorizzata e -1 in caso valga null
Considerazioni o altri suggerimenti sono ben accetti.