![](/img/trans.png)
[英]SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint
[英]SqlException The INSERT statement conflicted with the FOREIGN KEY constraint
INSERT语句与FOREIGN KEY约束FK_Kupovina_Kupac
冲突。 冲突发生在数据库OnlineApoteka
,表dbo.Kupac
,列'ID'。 该语句已终止。
我真的很困惑,我不知道为什么我们不允许? 我报告了一个错误,在抛出前; ?
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 Kolicina=Kolicina-@Kolicina
WHERE LekID=@LekID";
SqlCommand cmd = new SqlCommand(updateLager, con);
cmd.Parameters.AddWithValue("@LekID", lekID);
cmd.Parameters.AddWithValue("@Kolicina", kolicina);
cmd.ExecuteNonQuery();
string insertIntoKupovina=@"
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();
}
您收到错误的原因是因为数据库模式的定义方式。 特别地,表Kupac
用于与表Kupovina
的关系,使得KupacID
中的Kupovina
必须匹配来自Kupac
表中的ID
字段的值。
正因为如此,你不能插入记录Kupovina
使用表KupacID
不已经在存在Kupac
表-这是一个外键约束冲突。
您有两种选择:
但是你应该检查KupacAdapter.GetID(korisnickoIme)
的输出,它是应该提供KupacID
值的。 如果此方法由于某种原因未返回有效ID( Kupovina
表中的一个),则插入将失败,如上所述。
如果你想知道为什么异常没有开始“处理” ,那是因为你的catch块中的代码。 你基本上是在接受异常并重新抛出它,这是毫无意义的。 你可能根本就没有一个捕获块..
try {
// ...
}
catch (Exception ex) {
throw ex; // <--- this just re-throws the same exception that was caught!
}
finally {
}
在大多数情况下,几乎相当于:
try {
// ...
}
finally {
}
不同之处仅在于异常保留了多少堆栈跟踪,但异常仍然存在。
是的,您正在使用catch (Exception ex)
密钥违规 - 然后您在那里重新抛出异常。
在调用例程中是否有错误处理程序?
throw ex
- 不会“处理”错误 - 它只是提出另一个错误(虽然,在这种情况下是同一个 - 已被捕获的那个)
如果您期望此特定错误,那么您应该通过catch (SqlException ex)
捕获此特定错误 - 然后检查此特定错误。 如果不是这个错误那么throw ex;
备份调用堆栈...如果是这个错误那么你可以忽略(但最好是首先避免这种INSERT ......)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.