Tengo un formulario que acepta varios datos (a través de cuadros de texto y una casilla de verificación) y en el evento click inserta todos los datos en una tabla y selecciona la SCOPE_IDENTITY luego almacenarla en una variable para utilizarlo en la inserción de los elementos CheckBoxList utilizando un bucle en otra tablaExecuteScalar(); Con scope_identity() Generando "System.InvalidCastException: Cast especificado no es válido"
acuerdo con muchas respuestas y ejemplos de 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í es mi LinkButton código de método:
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();
}
}
}
Edit Extrañamente, la consulta funciona bien cuando la ejecuto directamente en el servidor sql express del visual studio.
la explicación extraño para este Problema extraño
primera solución por AlexB:
lo hice :) Mi servidor SQL 2008 vuelve System.Decimal empaquetados en 'objeto'. Intente utilizar System.Convert.ToInt32 en lugar de emitir.
Example : int NewBrandId = System.Convert.ToInt32(comm.ExecuteScalar());
Segunda solución por mí:
en lugar de utilizar "SELECT SCOPE_IDENTITY();" Utilicé "SELECT BrandId FROM Marcas WHERE BrandId = @@ Identity;" te da incluso más control , pero yo personalmente prefare la primera solución
N.B: "SELECCIONE @@ Identidad;" también funcionaría
Gracias chicos y espero que ayude a los demás!
Existen varios motivos por los que debe usar SCOPE_IDENTITY() en lugar de @@ IDENTITY. Intenta convertir SCOPE_IDENTITY() en INT en tu procedimiento. – Rory