2013-02-11 3 views
-1

내 테이블 '퀴즈'에 일부 행을 삽입하려고합니다. 내 테이블이 비어와 나는 그것이 작동하는 첫 번째 행을 삽입하려고하지만 난이 오류가 계속 두 번째 행 입력하려고 할 때마다 때 : 난 이후 원인이 뭐죠 내가 그나마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(); 
    } 
} 

를 bussiness 층 :

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' 테이블에 고유성 제약 조건이 있음을 알려줍니다. 동일한 값을 수동으로 테이블에 삽입 해 보았습니까? –

+0

삽입 한 첫 번째 ID는 괜찮습니까? 정수입니까? – CristisS

+0

첫 번째 삽입 후 열 값이 NULL인지 확인 했습니까? 아마도 그것은 문제를 발견하기위한 몇 가지 힌트를 가져올 것입니다. – HuorSwords

답변

0

대신 TryParse를 사용하여 변환 사용하지 마십시오, 즉 안전합니다. 당신이 당신의 데이터베이스에서 기본 키로 사용하고있는, 당신의 질문에 대한 지금

public string QuizNaam { get; set; } 

: 또한, getter 및 setter는 간단하게 쓸 수있다? 그것은 당신의 코드가 아닌 DB의 끝 부분에 더 좋아 보입니다. UNIQUE KEY 제약 조건의

+0

내 기본 키가 'QuizId'이고 데이터 유형이 int로 설정되어 있습니다 – user2057185

+0

사용자 입력을 기본 키로 사용하는 특별한 이유가 없다면 DB를 생성하는 것이 좋습니다. 이것이 문제의 원인 일 가능성이 큽니다. –

0

위반 'UQ_ 퀴즈 _D0C4726C5B2346B6'. 'dbo.Quiz'개체에 중복 키를 삽입 할 수 없습니다. 중복 키 값은 (<NULL>)입니다.

오류 메시지에 따르면 예상대로 코드를 제공하지 않지만 비어있는 상태 (null)로 남겨두고 데이터베이스에서 ID 열에 null 값을 허용합니다 (좋은 방법은 아닙니다). 그래서 첫 번째 삽입 잘 작동하지만 두 번째 테이블에 null로 데이터 집합을 감지하고이 예외가 발생합니다.

왜이 열에서 직렬 시퀀스를 사용하지 않습니까? 당신은 당신의 데이터베이스가이 작업을 수행합니다 database sequence (MSSQL)

+0

OP는 Oracle이 아닌 SQL Server를 사용합니다. –

+0

@ChristianHayter 고맙습니다. – CloudyMarble

0

에서 alook을하도록 할 수 있습니다 (QuizID이 테이블의 기본 키라고 가정.)

데이터베이스 계층에서 quiz.QuizIDNull 또는 비어 있지 않은지 확인하기 위해 확인하시기 바랍니다 .

0

특별한 의미있는 ID가 필요하지 않은 경우

집합 QuizID 필드를 기본 키로 Identity increment으로 입력하십시오. 그러면 삽입 할 필요가 없습니다.

관련 문제