У меня есть форма, которая принимает различные данные (через текстовые поля и флажок), а при событии клика они вставляют все данные в таблицу и выбирают scope_identity затем сохранить его в переменной, чтобы использовать его в вставки CheckBoxList элементов, используя петлю в другую таблицуExecuteScalar(); С scope_identity() Генерация «System.InvalidCastException: указанное приведение недействительно»
по мнению многих ответов и примеров это должно работать отлично .. но это дает мне эту ошибку:
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-сервере express visual studio!
Странная Объяснение этому Weird Проблема
Первое решение по AlexB:
Я сделал это :) Мой SQL Server 2008 возвращает System.Decimal упакованы в 'объект'. Попробуйте использовать System.Convert.ToInt32 вместо отливки.
Example : int NewBrandId = System.Convert.ToInt32(comm.ExecuteScalar());
Второе решение мной:
вместо того, чтобы использовать "SELECT SCOPE_IDENTITY();" Я использовал «SELECT BrandId FROM Brands WHERE BrandId = @@ Identity;" это дает вам еще больше controlm, но я лично заранее предварял
N.B: "SELECT @@ Identity;" будет также работы просто отлично
Спасибо, ребята, и я надеюсь, что это поможет другим!
Существует несколько причин, по которым вы должны использовать SCOPE_IDENTITY() вместо @@ IDENTITY. Попробуйте вместо этого применить SCOPE_IDENTITY() к INT внутри вашей процедуры. – Rory