cmd1.ExecuteScalar()
no está devolviendo un entero en caja. Asígnelo a un objeto y mírelo en el depurador para ver qué es realmente.
Supongo que devolverá un Decimal o un doble, y debes hacer:
Int32 result = (Int32)(double)cmd1.ExecuteScalar();
O:
Int32 result = (Int32)(Decimal)cmd1.ExecuteScalar();
[EDITAR en respuesta a una pregunta en los comentarios a continuación]
Para mantener el valor decimal, solo haz esto:
Decimal result = (Decimal) cmd1.ExecuteScalar();
Si lo necesitara, podría convertir el decimal en un doble:
double result = (double)(Decimal) cmd1.ExectuteScalar();