0

INSERT 语句与 FOREIGN KEY 约束冲突FK_Kupovina_Kupac。冲突发生在数据库OnlineApoteka、表dbo.Kupac、列“ID”中。该语句已终止。

我真的很困惑我不知道为什么我们不允许?我在 throw ex 中报告了一个错误;?

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();
    }
}

我有一个购买按钮的例行事件。当您单击 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();
    }
4

3 回答 3

2

您收到错误的原因是数据库模式的定义方式。特别地,该表Kupac用于与该表的关系Kupovina,因此KupacIDinKupovina必须与表中ID字段的值匹配Kupac

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

你有两个选择:

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

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

如果您想知道为什么异常没有开始“处理”而不是因为您的 catch 块中的代码。您基本上是在接受异常并重新抛出它,这有点毫无意义。你还不如根本没有 catch 块..

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

}

在大多数情况下,几乎等同于:

try {
   // ...
}    
finally { 

}

不同之处仅在于与异常一起保留了多少堆栈跟踪,但异常仍然冒泡了。

于 2013-03-05T16:07:55.403 回答
0

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

表中的KupacIDKupac是主键,而表中的KupacIDKupovina是指向主键的外键

阅读外键

于 2013-03-05T16:07:49.767 回答
0

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

您在调用例程中有错误处理程序吗?

throw ex- 不“处理”错误 - 它只是引发另一个错误(尽管在这种情况下是同一个错误 - 已被捕获的那个)

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

于 2013-03-05T16:07:57.557 回答