在c中插入行时违反UNIQUE KEY约束条件#
我试图在我的表格中插入一些行'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; }
}
}
不要使用转换,使用的TryParse来代替,这是更安全的。此外,getter和setter可以简单地写为:
public string QuizNaam { get; set; }
现在对于你的问题,你用在你的数据库中的主键?这听起来更像是你的DB端而不是你的代码。
我的主键是'QuizId',其数据类型设置为int – user2057185 2013-02-11 13:39:35
除非您有将用户输入用作主键的特定原因,否则我建议让DB自己生成它。这可能是您的问题的原因。 – 2013-02-11 13:42:10
唯一键约束违反 'UQ_ 测验 _D0C4726C5B2346B6'。 无法在对象'dbo.Quiz'中插入重复键。重复密钥 的值为
(<NULL>)
。
根据错误信息,似乎你的代码一点儿也不提供ID作为预期,但离开它空(NULL),和你的数据库允许ID列空值(这是不是一个好的做法)因此第一次插入工作正常,但第二次尝试将空值插入到表中时,它会检测到数据集为空,并且会得到此异常。
为什么不在这个列上使用连续序列?你可以让你的数据库做到这一点,需要alook在database sequence (MSSQL)
OP使用的是SQL Server,而不是Oracle。 – 2013-02-11 13:38:40
@ChristianHayter谢谢,修复 – CloudyMarble 2013-02-11 13:40:27
(假设QuizID
是你的表的主键。)
请检查以确保quiz.QuizID
在数据库层不Null
或空。
错误消息告诉你,你在'Quiz'表上有唯一性约束。你有没有尝试过将相同的值手动插入到表中? – 2013-02-11 13:34:59
您插入的第一个ID是否正确?它是一个整数吗? – CristisS 2013-02-11 13:35:43
您是否在第一次插入后检查了列值是否为NULL?也许它带给你一些提示,以找到问题... – HuorSwords 2013-02-11 13:35:45