venerdì 20 maggio 2011

c# Activerecord ExecuteQuery isnull sqlite

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. 

Sqlite equivalent ISNULL statement

Come descritto dalle core function http://www.sqlite.org/lang_corefunc.html#ifnull l'equivalente statement è IFNULL.