2013-03-05 4 views
0

Оператор INSERT противоречил ограничениям FOREIGN KEY FK_Kupovina_Kupac. Конфликт произошел в базе данных OnlineApoteka, таблица dbo.Kupac, столбец «ID». Заявление было прекращено.SqlException Оператор INSERT противоречил ограничениям FOREIGN KEY

Я действительно смущен, я не знаю, почему мы этого не допустим? Я сообщил об ошибке в броске; ?

public static void Kupi(long lekID, int kolicina, double cena, long nacinIsporukeID, string korisnickoIme) 
{ 
    SqlConnection con = new SqlConnection(); 
    try 
    { 
     con.ConnectionString = ConfigurationManager.ConnectionStrings["OnlineApotekaConnectionString"].ConnectionString; 
     con.Open(); 

     string updateLager = @" 
     UPDATE Lager 
     SET [email protected] 
     WHERE [email protected]"; 

     SqlCommand cmd = new SqlCommand(updateLager, con); 
     cmd.Parameters.AddWithValue("@LekID", lekID); 
     cmd.Parameters.AddWithValue("@Kolicina", kolicina); 

     cmd.ExecuteNonQuery(); 

     string [email protected]" 
      INSERT INTO Kupovina (KupacID, LekID, Datum, Kolicina, Cena, NacinIsporukeID) 
      VALUES (@KupacID, @LekID, @Datum, @Kolicina, @Cena, @NacinIsporukeID)"; 

     cmd = new SqlCommand(insertIntoKupovina, con); 
     cmd.Parameters.AddWithValue("@KupacID", KupacAdapter.GetID(korisnickoIme)); 
     cmd.Parameters.AddWithValue("@LekID", lekID); 
     cmd.Parameters.AddWithValue("@Datum", DateTime.Now.Date); 
     cmd.Parameters.AddWithValue("@Kolicina", kolicina); 
     cmd.Parameters.AddWithValue("@Cena", cena); 
     cmd.Parameters.AddWithValue("@NacinIsporukeID", nacinIsporukeID); 

     cmd.ExecuteNonQuery(); 

    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     con.Close(); 
    } 
} 

У меня есть обычное событие для кнопки Buy. При нажатии кнопки Kupi, должен быть удален из томов таблицы Lager и помещен в Kupac Kupovina

protected void kupiButton_Click(object sender, EventArgs e) 
{ 
    KupovinaAdapter.Kupi(Convert.ToInt64(kupovinaGreedView.SelectedDataKey["LekID"].ToString()), 
     Convert.ToInt32(kolicinaTextBox.Text), 
     Convert.ToInt64(kupovinaGreedView.SelectedDataKey["Cena"].ToString()), 
     Convert.ToInt64(nacinIsporukeDropDownList.SelectedValue), 
     User.Identity.Name); 
} 

protected void kupovinaGreedView_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (!String.IsNullOrEmpty(kupovinaGreedView.SelectedDataKey["Lek"].ToString())) 
    { 
     LekLabel.Text = kupovinaGreedView.SelectedDataKey["Lek"].ToString(); 
    } 

    if (!String.IsNullOrEmpty(kupovinaGreedView.SelectedDataKey["Kolicina"].ToString())) 
    { 
     kolicinaValidator.MaximumValue = kupovinaGreedView.SelectedDataKey["Kolicina"].ToString(); 
    } 
+0

Уточните ваш вопрос, пожалуйста. Что «Я не знаю, почему мы этого не допустим? Я сообщил об ошибке в броске; ? имею в виду? Кроме того, прочитайте, что означает «инструкция INSERT, противоречащая ограничению FOREIGN KEY», и посмотрите, может ли она объяснить проблему с вашим кодом. –

+0

Я * думаю * OP хочет знать, почему Exception все еще поднимается, а не просто игнорируется ... –

ответ

0

Kupac таблице не имеет значения KupacID в этой таблице, что вы пытаетесь вставить в Kupovina таблицу

KupacID столбец в таблице Kupac является первичным ключом, в то время как KupacID столбец в Kupovina таблицы внешний ключ указывая на первичный ключ

Прочтено на Foreign Keys

2

Причина, по которой вы получаете ошибку, связана с тем, как определена схема базы данных. В частности, таблица Kupac используется в связи с таблицей Kupovina, так что KupacID в Kupovina должен соответствовать значению из поля ID в таблице Kupac.

Из-за этого вы не можете вставлять записи в таблицу Kupovina с помощью KupacID, что уже не существует в таблице Kupac - это внешний ключ нарушение ограничений.

У вас есть два варианта:

  1. убедитесь, что вы первый вставить запись в таблицу Kupac
  2. падение внешнего ключа из схемы базы данных, если это делает бизнес-смысл

Но вы должны изучить вывод KupacAdapter.GetID(korisnickoIme), который должен предоставить значение KupacID. Если этот метод по какой-либо причине не возвращает действительный идентификатор (один из таблицы Kupovina), чем вставка не будет выполнена, как описано выше.

В случае, если вам интересно, почему Исключение не начинается «обработан», чем это из-за кода в вашем блоке catch. Вы в основном принимаете исключение и повторно бросаете его, что своего рода бессмысленно. Вы можете также просто нет поймать блок на всех ..

try { 
    // ... 
} 
catch (Exception ex) { 
    throw ex; // <--- this just re-throws the same exception that was caught! 
} 
finally { 

} 

Является ли, по большей части, почти эквивалентно:

try { 
    // ... 
}  
finally { 

} 

Разница лишь в том, сколько из трассировки стека сохраняется вместе с исключением, но, тем не менее, исключается.

+0

Это строки таблиц Kupac и Kupovina: Таблица Kupac ID JMBG Ime Prezime Adresa KorisnickoIme Telefon E-mail стол Kupac FK_Kupovina_Kupac и таблица Куповина ID KupacID LekID Datum Kolicina Cena NacinIsporukeID – user1798078

+0

И каков ваш вопрос в точности? Помог ли мой ответ? –

+0

Оператор INSERT противоречил ограничениям FOREIGN KEY «FK_Kupovina_Kupac». Конфликт произошел в базе данных «OnlineApoteka», таблице «dbo.Kupac», в столбце «ID». Заявление было прервано. Я проверил все ответы на форуме. Правильный вопрос: как решить проблему, когда я подключил все, не знаю, где я ошибаюсь? – user1798078

0

Да, вы поймаете нарушение ключа с помощью catch (Exception ex) - однако затем вы свернете Исключение.

У вас есть обработчик ошибок в вызывающей процедуре?

throw ex - не «обрабатывать» ошибку - это просто повышения другой (хотя, тот же один в данном случае - тот, который был пойман)

Если вы ждете этого конкретной ошибки затем вы должны поймать эту конкретную ошибку на catch (SqlException ex) - и затем проверить эту конкретную ошибку. Если это не эта ошибка, то throw ex; резервное копирование стоп-кода ... Если это is эта ошибка, то вы можете игнорировать (но было бы лучше просто избежать этого типа INSERT в первую очередь ...)

+0

У меня нет головы для рутинных ошибок. Когда вы нажимаете кнопку Kupi на форме, должны произойти покупки. У меня есть обычное событие для кнопки Kupi – user1798078

Смежные вопросы