繁体   English   中英

SqlException INSERT语句与FOREIGN KEY约束冲突

[英]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表-这是一个外键约束冲突。

您有两种选择:

  1. 确保首先将记录插入Kupac表
  2. 如果具有商业意义,则从数据库模式中删除外键约束

但是你应该检查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 { 

}

不同之处仅在于异常保留了多少堆栈跟踪,但异常仍然存在。

Kupac表中没有您尝试插入Kupovina表的该表中的KupacID

KupacIDKupac表的主键,而KupacIDKupovina表外键指回主键

阅读外键

是的,您正在使用catch (Exception ex)密钥违规 - 然后您在那里重新抛出异常。

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

throw ex - 不会“处理”错误 - 它只是提出另一个错误(虽然,在这种情况下是同一个 - 已被捕获的那个)

如果您期望此特定错误,那么您应该通过catch (SqlException ex)捕获此特定错误 - 然后检查此特定错误。 如果不是这个错误那么throw ex; 备份调用堆栈...如果这个错误那么你可以忽略(但最好是首先避免这种INSERT ......)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM