在c#中插入行时违反了UNIQUE KEY约束
本文关键字:UNIQUE KEY 约束 插入 | 更新日期: 2023-09-27 17:58:35
我正试图在表"Quiz"中插入一些行。当我的表是空的,并且我试图插入第一行时,它是有效的,但每当我试图输入第二行时,我总是得到这个错误:
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; }
}
}
违反UNIQUE KEY约束"UQ_测验_D0C4726C5B2346B6"。无法在对象"dbo.Quiz"中插入重复的键。重复的键值为CCD_ 2。
根据错误消息,您的代码似乎没有按预期提供Id,而是将其保留为空(null),并且您的数据库允许在Id列中使用null值(这不是一个好的做法),因此第一次插入操作很好,但第二次尝试将null插入表时,它检测到一个包含null的数据集,并出现此异常。
你为什么不在这个专栏中使用一个序列呢?您可以让您的数据库执行此操作,查看数据库序列(MSSQL)
不要使用Convert,而是使用TryParse,这样更安全。此外,getter和setter可以简单地写成:
public string QuizNaam { get; set; }
现在,对于您的问题,您在数据库中使用什么作为主键?它听起来更像是数据库端的东西,而不是代码。
(假设QuizID
是表的主键。)
请检查以确保数据库层中的quiz.QuizID
不是Null
或为空。
如果您不需要特别有意义的ID。
将QuizID字段设置为具有标识增量的主键,然后无需插入。