2013-02-11 48 views
-1

我试图在我的表格中插入一些行'Quiz'。当我的表是空的,我尝试插入它工作的第一行,但每当我试图进入第二行我不断收到此错误:在c中插入行时违反UNIQUE KEY约束条件#

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

} 
+1

错误消息告诉你,你在'Quiz'表上有唯一性约束。你有没有尝试过将相同的值手动插入到表中? – 2013-02-11 13:34:59

+0

您插入的第一个ID是否正确?它是一个整数吗? – CristisS 2013-02-11 13:35:43

+0

您是否在第一次插入后检查了列值是否为NULL?也许它带给你一些提示,以找到问题... – HuorSwords 2013-02-11 13:35:45

回答

0

不要使用转换,使用的TryParse来代替,这是更安全的。此外,getter和setter可以简单地写为:

public string QuizNaam { get; set; } 

现在对于你的问题,你用在你的数据库中的主键?这听起来更像是你的DB端而不是你的代码。

+0

我的主键是'QuizId',其数据类型设置为int – user2057185 2013-02-11 13:39:35

+0

除非您有将用户输入用作主键的特定原因,否则我建议让DB自己生成它。这可能是您的问题的原因。 – 2013-02-11 13:42:10

0

唯一键约束违反 'UQ_ 测验 _D0C4726C5B2346B6'。 无法在对象'dbo.Quiz'中插入重复键。重复密钥 的值为(<NULL>)

根据错误信息,似乎你的代码一点儿也不提供ID作为预期,但离开它空(NULL),和你的数据库允许ID列空值(这是不是一个好的做法)因此第一次插入工作正常,但第二次尝试将空值插入到表中时,它会检测到数据集为空,并且会得到此异常。

为什么不在这个列上使用连续序列?你可以让你的数据库做到这一点,需要alook在database sequence (MSSQL)

+0

OP使用的是SQL Server,而不是Oracle。 – 2013-02-11 13:38:40

+0

@ChristianHayter谢谢,修复 – CloudyMarble 2013-02-11 13:40:27

0

(假设QuizID是你的表的主键。)

请检查以确保quiz.QuizID在数据库层不Null或空。

0

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

设置QuizID字段作为主键与Identity increment那么你不需要插入它。

相关问题