He encapsulado la mayor parte de mi lógica SQL en un DAL. Uno de estos métodos DAL extrae enteros escalares utilizando la siguiente lógica. Puede funcionar para usted:
object temp = cmnd.ExecuteScalar();
if ((temp == null) || (temp == DBNull.Value)) return -1;
return (int)temp;
Sé que ha ingresado mucho código arriba, pero creo que esta es realmente la esencia de su problema. ¡Buena suerte!