cmd1.ExecuteScalar()
não está retornando um inteiro encaixotado. Atribua-o a um objeto e examine-o no depurador para ver o que realmente é. Eu estou supondo que vai retornar um Decimal ou um duplo, e você precisa fazer:
Int32 result = (Int32)(double)cmd1.ExecuteScalar();
Ou:
Int32 result = (Int32)(Decimal)cmd1.ExecuteScalar();
[EDIT em resposta a uma pergunta nos comentários abaixo]
Para manter o valor decimal, basta fazer isso:
Decimal result = (Decimal) cmd1.ExecuteScalar();
Se necessário, você pode converter o decimal em um duplo:
double result = (double)(Decimal) cmd1.ExectuteScalar();