2013-02-11 104 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那麼你不需要插入它。

相關問題