Eu encapsulei a maior parte da minha lógica SQL em um DAL. Um desses métodos DAL extrai Ints escalares usando a seguinte lógica. Pode funcionar para você:
object temp = cmnd.ExecuteScalar();
if ((temp == null) || (temp == DBNull.Value)) return -1;
return (int)temp;
Eu sei que você digitou muito código acima, mas acho que essa é realmente a essência do seu problema. Boa sorte!