-1

我正在尝试在我的表“测验”中插入一些行。当我的表为空并且我尝试插入第一行时它可以工作,但是每当我尝试输入第二行时,我都会收到此错误:

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

不要使用 Convert,而是使用 TryParse,这样更安全。此外,getter 和 setter 可以简单地写成:

public string QuizNaam { get; set; }

现在对于您的问题,您在数据库中使用什么作为主键?这听起来更像是你的数据库端的东西,而不是你的代码。

于 2013-02-11T13:35:05.513 回答
0

违反 UNIQUE KEY 约束“UQ_ Quiz _D0C4726C5B2346B6”。无法在对象“dbo.Quiz”中插入重复键。重复键值为(<NULL>)

根据错误消息,您的代码似乎没有按预期提供 Id 但将其留空(null),并且您的数据库允许 Id 列中的空值(这不是一个好习惯),所以第一次插入工作正常但是当您第二次尝试将 null 插入表中时,它会检测到带有 null 的数据集,并且您会收到此异常。

为什么不在此列上使用串行序列?你可以让你的数据库这样做,看看一个数据库序列(MSSQL)

于 2013-02-11T13:35:58.747 回答
0

(假设这QuizID是您的表的主键。)

请检查以确保quiz.QuizID您的数据库层不是Null空的。

于 2013-02-11T13:40:25.687 回答
0

如果您不需要特殊有意义的 ID。

QuizID字段设置为具有标识增量的主键,然后您不需要插入它。

于 2013-02-11T13:40:55.140 回答