-1

テーブル「クイズ」にいくつかの行を挿入しようとしています。テーブルが空で最初の行を挿入しようとすると動作しますが、2 行目を入力しようとすると常にこのエラーが発生します:

Violation of UNIQUE KEY constraint 'UQ__Quiz__D0C4726C5B2346B6'. Cannot insert duplicate key in object 'dbo.Quiz'. The duplicate key value is (<NULL>).

行ごとに常に異なるIDを入力するため、何が原因なのか本当にわかりません。

プレゼンテーション層:

if (IsValidData())
{
    quiz.QuizID = Convert.ToInt32(quizIDTextBox.Text);               
    quiz.QuizNaam = quizNaamTextBox.Text;
    quiz.QuizDatum = Convert.ToString(quizDatumDateTimePicker.Text);
    quiz.Locatie = locatieTextBox.Text;
    quiz.Type = typeTextBox.Text;
    quiz.Moeilijkheidsgraad = moeilijkheidsgraadTextBox.Text;

    QuizDB.InsertQuiz(quiz);
    MessageBox.Show("Quiz Toegevoegd", "Quiz");
}

データベース層:

public static void InsertQuiz(Quiz quiz)
{

    string insertStatement = "INSERT INTO Quiz (QuizID,QuizNaam,QuizDatum,Locatie,Type,Moeilijkheidsgraad) VALUES (@QuizID,@QuizNaam, @QuizDatum, @Locatie, @Type, @Moeilijkheidsgraad)";

    SqlCommand quizCommand = new SqlCommand(insertStatement, conn);
    quizCommand.Parameters.Clear();

    quizCommand.Parameters.AddWithValue("@QuizID", quiz.QuizID);
    quizCommand.Parameters.AddWithValue("@QuizNaam", quiz.QuizNaam);
    quizCommand.Parameters.AddWithValue("@QuizDatum", quiz.QuizDatum);
    quizCommand.Parameters.AddWithValue("@Locatie", quiz.Locatie);
    quizCommand.Parameters.AddWithValue("@Type", quiz.Type);
    quizCommand.Parameters.AddWithValue("@Moeilijkheidsgraad",quiz.Moeilijkheidsgraad);

    try
    {
        conn.Open();
        quizCommand.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        throw ex;
    }
    finally
    {
        conn.Close();
    }
}

事業層 :

public class Quiz
{
    private int cQuizId;
    private string cQuizNaam;
    private string cQuizDatum;
    private int cWinnaarId;
    private string cLocatie;
    private string cType;
    private string cMoeilijkheidsgraad;

    public Quiz() { }

    public int QuizID
    {
        get { return cQuizId;}
        set { cQuizId = value; }
    }

    public string QuizNaam
    {
        get { return cQuizNaam; }
        set { cQuizNaam = value; }
    }
    public string QuizDatum
    {
        get { return cQuizDatum; }
        set { cQuizDatum = value; }
    }

    public int WinnaarId
    {
        get { return cWinnaarId; }
        set { cWinnaarId = value; }
    }

    public string Locatie
    {
        get { return cLocatie; }
        set { cLocatie = value; }
    }
    public string Type
    {
        get { return cType; }
        set { cType = value; }
    }
    public string Moeilijkheidsgraad
    {
        get { return cMoeilijkheidsgraad; }
        set { cMoeilijkheidsgraad = value; }
    }

}
4

4 に答える 4

0

UNIQUEKEY制約の違反'UQ_クイズ_D0C4726C5B2346B6'。オブジェクト'dbo.Quiz'に重複するキーを挿入できません。重複するキー値は(<NULL>)です。

エラーメッセージによると、コードは期待どおりにIDを提供していないようですが、空のまま(null)であり、データベースではId列にnull値が許可されているため(これは適切な方法ではありません)、最初の挿入は正常に機能しますただし、2回目にnullをテーブルに挿入しようとすると、nullのデータセットが検出され、この例外が発生します。

この列でシリアルシーケンスを使用しないのはなぜですか?データベースにこれを行わせることができます。データベースシーケンス(MSSQL)を見てください。

于 2013-02-11T13:35:58.747 に答える
0

Convert を使用しないでください。代わりに TryParse を使用してください。そのほうが安全です。また、ゲッターとセッターは次のように簡単に記述できます。

public string QuizNaam { get; set; }

質問ですが、データベースの主キーとして何を使用していますか? コードではなく、DB側の何かのように聞こえます。

于 2013-02-11T13:35:05.513 に答える
0

QuizID(それがテーブルの主キーであると仮定します。)

quiz.QuizIDデータベース レイヤが ではないNullか空であることを確認してください。

于 2013-02-11T13:40:25.687 に答える
0

特別な意味のある ID が必要ない場合。

QuizIDフィールドを主キーとしてID インクリメントとして設定すると、挿入する必要はありません。

于 2013-02-11T13:40:55.140 に答える