вау алекс, я просто сдался и попытался найти альтернативные решения =) .. это действительно странно и утомительно: S: D

от вопрос уже есть ответ здесь:

Определенное приведение недействительно при получении scope_identity 4 ответа

У меня есть форма, которая принимает различные данные (через текстовые поля и список флажков), и по событию щелчка они вставляют все данные в таблицу и выбирают scope_identity, а затем сохраняют их в переменной, чтобы использовать их для вставки элементов списка флажков. используя цикл в другую таблицу

согласно многим ответам и примерам это должно работать отлично! .. но это дает мне эту ошибку:

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

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

Вот мой код метода 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();
            }
        }
    }

Редактировать Странно, но запрос работает нормально, когда я запускаю его непосредственно в SQL Server Express Visual Studio!

Странное объяснение этой странной проблемы

Первое решение от alexb:

Я сделал это :) Мой SQL Server 2008 возвращает System.Decimal, упакованный в «объект». Попробуйте использовать System.Convert.ToInt32 вместо приведения.

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

Второе решение от меня:

вместо использования «SELECT scope_identity ();» Я использовал «ВЫБРАТЬ БРЕНДИД ИЗ БРЕНДОВ, ГДЕ BrandId = @@ Identity» это дает вам еще больше контроля, но я лично предпочитаю первое решение

N.B: «ВЫБЕРИТЕ @@ Identity»; также будет работать просто отлично

Спасибо, ребята, и я надеюсь, что это поможет другим!

Ответы на вопрос(5)

Ваш ответ на вопрос