2014-09-11 2 views
-11

내 미니 프로젝트는 C# .net이고 내 프로젝트는 Windowsform 퀴즈 애플리케이션입니다. 내 앱에는 'admin'과 'user'라는 두 명의 사용자가 있습니다. 관리자는 질문을 삭제하고 추가 할 수 있습니다.루프가 작동하지 않습니다. C# .net

내 문제는입니다. 관리자가 중간에서 질문을 삭제할 때 질문 번호를 다시 정리하고 싶습니다. 질문은 질문 번호에 따라 무작위로 선택되기 때문에. while 루프를 사용하고 있습니다. 루프가 실행 중이지만 업데이트 명령이 작동하지 않습니다. 임의의 질문을 임의로 선택하는 또 다른 루프 또는 다른 방법을 제안합니다. 여기

내 삭제 버튼에 코드입니다 :

private void button_DELQUE_DELETE_Click(object sender, EventArgs e) 
{ 
    //deleting questions and options 
    CMD = new SqlCommand("DELETE FROM QUESTIONS WHERE NO='" +int.Parse( textBox_DELQUE_NO.Text).ToString() + "'", CNN); 
    CMD.ExecuteNonQuery(); 
    CMD = new SqlCommand("DELETE FROM OPTIONS WHERE NO='" + int.Parse(textBox_DELQUE_NO.Text).ToString() + "'", CNN); 
    CMD.ExecuteNonQuery(); 

    int TOT = 0; 
    CMD = new SqlCommand("SELECT COUNT(*) FROM QUESTIONS", CNN); 
    TOT = int.Parse(CMD.ExecuteScalar().ToString());//total no.of questions after deletion 
    int I = 0; 
    int DEL = 0; 
    int TEMP = 0; 
    DEL = int.Parse(textBox_DELQUE_NO.Text.ToString());//deleted question 
    TEMP = DEL; 

    while (TEMP == TOT) 
    { 
     I = TEMP; 
     I = I + 1; 
     CMD = new SqlCommand("UPDATE QUESTIONS SET NO='" + I + "' WHERE NO='" + TEMP + "'", CNN); 
     CMD.ExecuteNonQuery(); 
     CMD = new SqlCommand("UPDATE OPTIONS SET NO='" + I + "' WHERE NO='" + TEMP + "'", CNN); 
     CMD.ExecuteNonQuery(); 
     TEMP = TEMP + 1; 

    } 
+0

하나를 삭제할 때 모든 레코드를 업데이트 하시겠습니까? 그것을 바꾸라고 제안 할 수 있습니까? 사실 ** 당신은 ** 그것을 필요로하지 않습니다, 질문은 당신이 그것을 사용하게 될 것입니다 ... –

+1

그것은 언젠가 C# 코드임을 깨닫는 데 언젠가는 걸렸습니다. [명명 규칙 (naming conventions)] (http://msdn.microsoft.com/en-us/library/ms229002%28v=vs.110%29.aspx)을 따르십시오. –

+5

불행히도 코드에는 "잘못"이 있습니다 (당면 문제는 제외). 몇 년 전에 Jr.을 해고하기 전부터 모범 사례를 너무 많이 위반 한 것을 보지 못했기 때문에 머리를 아프게했습니다. ;-) –

답변

3

왜 그냥 제거 된 id 후 모든 업데이트는? 당신이 while을 필요로하지 않는 것처럼, 그리고 성능은 300 % 올라갈 것입니다.

update questions set no = no - 1 where no > @yourRemovedID 
1

여기에 몇 가지 문제가 있다고 생각합니다. 첫 번째는 다음과 같습니다.

while (TEMP == TOT) 
{ 
    ... 
    TEMP = TEMP + 1; 
} 

최대 한 번만 실행됩니다. 이것은 나쁜 루프처럼 보입니다. 둘째, 당신은 다음과 같습니다

CMD = new SqlCommand("UPDATE QUESTIONS SET NO='" + I + "' WHERE NO='" + TEMP + "'", CNN); 
TEMP = TEMP + 1; 

루프가 그 어느 때보 다 한번 더 실행하면 (그것이 경우처럼/foreach 문에 대한) 다음 지속적으로 같은 기록을 갱신 될 것이다. 방금 TEMP가 무엇인지 +1로 숫자 "I"를 증가 시켰습니다. 따라서 새 레코드는 where 절에 있습니다.

이 논리를 다시 생각해보십시오. 한 번만 실행하려면 while에서 if으로 변경하면 다른 사람이보기에 더 적합합니다. 실제로 숫자를 "다시 배열"하는 것처럼 보이지 않습니다. 제거 된 번호를 보완하기 위해 번호를 이동하는 중입니다. 그것이 당신이 의미하는 것이거나 당신이 새로운 무작위 순서로 모든 것을 원한다고 말하는 것입니까? 그것이 첫 번째라면, 패트 릭의 대답은 갈 길입니다.

+0

5 개의 질문이있는 경우 질문 번호는 1,2,3,4,5입니다. 그리고 세 번째 질문을 삭제하면 숫자는 1 = 1,2 = 2,4 = 3,5 = 4 일 것입니다. – Kannan

+0

그래서 이전 버전에서는 제거 된 번호를 보완하기 위해 번호를 아래로 이동합니다. SQL에 대한 @ Patrick의 대답으로 가십시오.하지만 논리를 다시 고칠 필요가 있습니다. – valdetero

+1

이것은 아마도 코드와 하드 코드 된 SQL 사이에 혼합 대신 하나의 저장 프로 시저에 넣을 수 있습니다. – valdetero

관련 문제