ExecuteScalar (); With scope_identity () Generando "System.InvalidCastException: la conversión especificada no es válida" [duplicado]

Esta pregunta ya tiene una respuesta aquí:

La conversión específica no es válida mientras se recupera la identidad del alcance 4 respuestas

Tengo un formulario que acepta varios datos (a través de cuadros de texto y una lista de casillas de verificación) y en el evento de clic insertan todos los datos en una tabla y seleccionan el alcance_identidad y luego lo almacenan en una variable para usarlo en la inserción de los elementos de la lista de casillas de verificación usando un bucle en otra mesa

De acuerdo con muchas respuestas y ejemplos, esto debería funcionar perfectamente ... pero me da este error:

Exception Details: System.InvalidCastException: Specified cast is not valid.

Line 66:             int NewBrandId = (int)comm.ExecuteScalar(); 

Aquí está mi código de método linkbutton:

   protected void lnkbtnUploadAndSubmit_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MOODbCenterConnection"].ConnectionString);

        SqlCommand comm = new SqlCommand("INSERT INTO Brands (BrandName, BrandLogo, BrandWebsite, IsBrandVisible) VALUES (@Name, @Logo, @Website, @IsVisible); SELECT scope_identity();", conn);

        comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 50);
        comm.Parameters["@Name"].Value = txtbxBrandName.Text;

        comm.Parameters.Add("@Logo", System.Data.SqlDbType.Text);
        comm.Parameters["@Logo"].Value = fileuploadLogo.PostedFile.FileName;

        comm.Parameters.Add("@Website", System.Data.SqlDbType.Text);
        comm.Parameters["@Website"].Value = txtbxWebsite.Text;

        comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);
        comm.Parameters["@IsVisible"].Value = chkbxIsPublished.Checked;
        conn.Open();


        int NewBrandId = (int)comm.ExecuteScalar(); 

        conn.Close();

        foreach (ListItem li in chkbxlstCuisines.Items)
        {
            if (li.Selected)
            {
                conn.Open();

                SqlCommand comm2 = new SqlCommand("INSERT INTO BrandCuisines (CuisineId, BrandId) VALUES (@CuisineId, @NewBrandId)", conn);

                comm2.Parameters.Add("@CuisineId", System.Data.SqlDbType.Int);
                comm2.Parameters["@CuisineId"].Value = li.Value;

                comm2.Parameters.Add("@NewBrandId", System.Data.SqlDbType.Int);
                comm2.Parameters["@NewBrandId"].Value = NewBrandId;
                comm2.ExecuteNonQuery();
                conn.Close();
            }
        }
    }

Editar Extrañamente, la consulta funciona bien cuando la ejecuto directamente en el servidor SQL Express del Visual Studio.

La extraña explicación de este extraño problema

Primera solución de alexb:

Lo hice :) Mi servidor SQL 2008 devuelve System.Decimal empaquetado en 'objeto'. Intente usar System.Convert.ToInt32 en lugar de emitir.

Example : int NewBrandId = System.Convert.ToInt32(comm.ExecuteScalar());

Segunda solución por mí:

en lugar de usar "SELECT scope_identity ();" Usé "SELECCIONAR BrandId DE Marcas DONDE BrandId = @@ Identity;" te da aún más control, pero personalmente prefiero la primera solución

N.B: "SELECCIONAR @@ Identidad"; también funcionaría bien

¡Gracias chicos y espero que ayude a los demás!

Respuestas a la pregunta(5)

Su respuesta a la pregunta