0

INSERTステートメントがFOREIGNKEY制約と競合しましたFK_Kupovina_KupacOnlineApotekaデータベース、テーブルdbo.Kupac、列'ID'で競合が発生しました。ステートメントは終了されました。

私は本当に混乱していますなぜ私たちが許可しないのか分かりませんか?スロー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ボリュームから削除され、KupacKupovinaに配置されます。

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、テーブルとの関係で使用されます。KupovinaKupacIDKupovinaIDKupac

このため、テーブルにまだ存在しないKupovinaを使用してテーブルにレコードを挿入することはできません。これは外部キー制約違反です。KupacIDKupac

次の 2 つのオプションがあります。

  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がテーブルにありませんKupacIDKupovina

表のKupacIDKupacは主キーであり、表のKupacID列はKupovina主キーを指す外部キーです。

外部キーについて読む

于 2013-03-05T16:07:49.767 に答える
0

はい、キー違反をキャッチしていますが、catch (Exception ex)そこで例外を再スローします。

呼び出しルーチンにエラー ハンドラはありますか?

throw ex- エラーを「処理」しません - 別のエラーを発生させるだけです (ただし、この場合は同じもの - キャッチされたもの)

この特定のエラーが予想される場合は、この特定のエラーを - でキャッチしてから、この特定のエラーcatch (SqlException ex)を確認する必要があります。このエラーでない場合はthrow ex;、コールスタックをバックアップします...このエラーの場合無視できます(ただし、最初にこの種のINSERTを回避することをお勧めします...)

于 2013-03-05T16:07:57.557 に答える