2013-03-05 131 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,应该从表拉格册中删除,并放置在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

请澄清你的问题。 '我不知道为什么我们不允许?我在前面报告了一个错误; ?意思?另外,请阅读“与FOREIGN KEY约束冲突的INSERT语句”的含义,并查看它是否可以解释代码中的问题。 – 2013-03-05 16:08:58

+0

我想* OP想知道为什么异常仍然被提出,而不是只是忽略... – 2013-03-05 16:11:20

回答

0

Kupac表中没有该表中KupacID值,你试图插入Kupovina

Kupac表中的列KupacID是主键,而在Kupovina表中的列KupacID是外键指回主键

阅读Foreign Keys

2

您收到错误的原因是因为如何定义数据库模式。特别地,表Kupac用于与表Kupovina的关系,使得Kupovina中的KupacID必须与Kupac表中的ID字段的值匹配。

因此,您不能使用Kupac表中不存在的KupacID将记录插入到Kupovina表中 - 这是外键约束违规。

你有两个选择:

  1. 请务必先插入一条记录到Kupac表
  2. 从数据库架构删除外键约束如果让企业感觉

但是,您应该检查KupacAdapter.GetID(korisnickoIme)的输出,该值应该是KupacID的值。如果由于某种原因该方法没有返回一个有效的ID(Kupovina表中的一个),插入将失败,如上所述。

如果你想知道为什么异常不是开始“处理”比那是因为你的catch块中的代码。你基本上正在抛出异常并重新抛出,这是毫无意义的。你还不如干脆不都有一个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电话电子邮件表Kupac FK_Kupovina_Kupac和表Kupovina ID KupacID LekID Datum Kolicina Cena NacinIsporukeID – user1798078 2013-03-05 16:30:40

+0

准确地说你的问题是什么?我的回答对你有帮助吗? – 2013-03-05 16:43:56

+0

INSERT语句与FOREIGN KEY约束“FK_Kupovina_Kupac”冲突。冲突发生在数据库“OnlineApoteka”,表“dbo.Kupac”,列'ID'。 该声明已被终止。我检查了所有来自论坛的答案正确的问题是如何解决问题,当我连接所有不知道我在哪里错了? – user1798078 2013-03-05 17:00:52

0

是的,您正在通过catch (Exception ex)发现重要违规行为 - 但是您会在那里重新抛出Exception。

在调用例程中是否有错误处理程序?

throw ex - 不“处理”的错误 - 它只是提出另一项(虽然,同样的一个在这种情况下 - 这已经陷入了一个)

如果你期待这特定错误然后你应该赶上catch (SqlException ex)这个特定的错误 - 然后检查这个特定的错误。如果它是而不是这个错误然后throw ex;备份调用堆栈...如果它这个错误,那么你可以忽略(但最好避免这种INSERT在第一位... )

+0

我没有头常规错误。当你点击窗体上的Kupi按钮需要发生购买。我有一个常规事件的按钮Kupi – user1798078 2013-03-05 16:17:52

相关问题