2014-06-13 5 views
0

데이터베이스에서 데이터를 검색하려고합니다. .sdf 파일을 추가하고 아래에 표시된 코드를 작성했습니다. 내 테이블 이름은 info이고 세 개의 열 (id, namecode)이 있습니다.CheckedListBox를 채울 수 없습니다.

내가하고자하는 것은 CheckedListBox에이 데이터를 채우는 것이지만 코드를 실행할 때 아무런 변화가 없습니다. CheckedListBox이 비어 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

SqlCeDataReader dr; 
SqlCeConnection con; 
SqlCeCommand cmd; 

void loadData() 
{ 
    cmd.CommandText = "select column_name from Information_schema.columns where table_name='info' order by ordinal_position"; 
    con.Open(); 
    dr = cmd.ExecuteReader(); 

    if (dr.HasRows) 
    { 
     while (dr.Read()) { 
     checkedListBox1.Items.Add(dr[0].ToString()); 
    } 

    dr.Close(); 
    con.Close(); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    con = new SqlCeConnection(); 
    [email protected]"Data Source=c:\users\xxx\documents\visual studio 2012\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Database1.sdf"; 
    cmd = new SqlCeCommand(); 
    cmd.Connection = con; 
    loadData(); 
} 
+1

"사용 중"문에 있어야하는 많은 일회용 리소스가 있음을 지적하십시오. 자세한 내용은 http://stackoverflow.com/q/212198/을 참조하십시오. – Anthony

+2

오늘은 디버거를 사용하는 좋은 날입니다. – LarsTech

+1

디버깅을 시도하고'dr.HasRows'가 참인지 확인하려고 했습니까? – Leonardo

답변

0

. 이것은 몇 가지 이유로 까다 롭습니다. 먼저 코드가 데이터베이스를 호출하고 자신의 테이블에있는 것이 아닌 시스템 데이터베이스의 열에 대한 정보를 얻는다는 점에서 약간 이상한 쿼리를 수행합니다. 아무도 그 결과가 정확히 무엇인지 알지 못합니다. 그 라인을 유사한 효과를 가진 다른 것으로 대체하는 것이 가능할 수도 있지만 (예 : 코드에서 더미 값으로 초기화되는리스트) 버그를 없애기 위해 버그를 사라지게 할 수 있습니다. 아무도 현명하지 못하다. 우리는 잠시 후에이 아이디어로 돌아올 것입니다.

이 질문은 StackOverflow에 이상적이지 않습니다. 한 가지 이유는 제가 방금 설명한 것입니다. 여러분을 돕기 위해 코드가하는 것을 정확히 복제하는 것이 어려울 수 있습니다. 따라서 유용한 답을 얻지 못할 수도 있습니다. 또 다른, 약간 반대되는 이유는 누군가 (약간 부지런하고 나보다주의 깊은) 코드에서 간단한 오타 나 잡기를 발견 할 수 있다는 것입니다. 내가 이것을 타이핑하는 동안 이미 이런 일이 일어 났을 것입니다. 그들은 당신에게 이것을 알려주는 답변이나 코멘트를 올리면 코드를 수정하게됩니다. 그러나 질문은 다른 사람에게 특히 유용하지 않습니다. 아무도 당신과 똑같은 타이핑이나 실수를 저지르기 쉽습니다. 비록 그들이하더라도, 아마도 CheckedListBox 또는 SqlCeDataReader과 관련이없는 약간 다른 맥락에있을 것이며 그들은 결코이 질문을 찾을 수 없을 것입니다.

이러한 유형의 질문 및 답변은 ​​본질적으로이 사이트에 아무 것도 추가하지 않습니다. 그들은 또한 당신에게 특히 도움이되지 않습니다. 이것이 바로 디버깅을 배우지 않는 이유입니다.

내 경험에 비추어 볼 때 훌륭한 프로그래머는 거의 항상 훌륭한 디버거입니다. 우리 중 대부분은 작은 실수를 많이합니다 - 신속하게 찾아 내고 수정하는 것은 평균 생산성과 큰 생산성의 차이입니다. 좋은 디버거가된다는 것은 또한 생각과 (또는 다른 사람의) 코드와 다른 관계가 있음을 의미합니다. 동시에 여러 가지 다른 경우와 가능성을 마음에 품고보다 유연하게 사고 할 수 있습니다. 이것은 발산 생각이고, 대답으로 이끄는 convergent 생각, 생각만큼이나 중요하다고 천천히 인식되고 있습니다.

문제점을 해결하고 프로그래머로 진행하기 위해해야 ​​할 일은 올바르게 디버그됩니다. 이 작업을 수행하고 여전히 어려운 질문 (또는 도구의 버그)이있는 경우 게시 할 코드 조각을 훨씬 짧게 작성하여 의도하지 않은 동작을 훨씬 잘 설명 할 수 있습니다.

기본적으로 코드를 디버깅하는 두 가지 방법이 있습니다. 즉, 단계별로 진행하고 'print lines'입니다. (커널 코드, 멀티 스레딩 및 메시지 전달과 같은 이상하고 어려운 코드는 디버깅하기가 훨씬 어려울 수 있습니다.이 두 기술은 다른 모든 것들과 함께 긴 방법을 얻을 것입니다.) 두 가지 모두에서 주요 아이디어는 변수의 중간 값을보고, 평가의 다른 단계에서.Visual Studio에서 C# 코드를 단계별로 실행할 수있는 디버깅 지원은 매우 훌륭하지만 간단하고 합리적인 언어 독립성을 유지하기 위해 예제로 인쇄 줄을 사용합니다.

실행 흐름이 거기에 도착하는지 여부를 알고 싶은 프로그램의 아무 곳이나 추가하십시오. 예 :

Console.WriteLine("We do have some rows"); 

if (dr.HasRows) { 행 뒤에 있어야합니다. 이 프로그램이 콘솔 프로그램이고이를 실행하면 콘솔 창에이 출력이 나타나는지 여부를 알 수 있습니다. 그렇지 않으면 Debug.Print을 사용하여 텍스트를 VS의 '출력'창으로 보내거나 Winforms MessageBox을 사용하여 경고 창에 텍스트를 표시 할 수 있습니다.

쿼리 결과에 행이 있는지 없는지를 즉시 확인할 수 있습니다. 그렇지 않은 경우 쿼리 나 실행 방법에 문제가 있습니다. 먼저 동일한 데이터베이스에서 동일한 쿼리를 다른 방법으로 실행해야합니다 (예 : sqlcmd 또는 Sql Server Management Studio). 당신이 이것을하지 않았고, dr.HasRows이 사실인지 아닌지를 알지 못한다는 사실은 당신이 제대로 디버깅을하지 못했다는 것을 즉시 보여주었습니다. [Edit : @Leonardo는 또한 주석에서 정확히 같은 것을 정확하게 지적했습니다.] 다른 곳에서 쿼리를 실행할 때 유효한 응답 행을 얻었지만이 코드를 실행할 때가 아니라면 연결을 설정하거나 실행하는 데 문제가 있습니다. C#에서 쿼리. 행이 없으면 쿼리 자체에 문제가 있습니다. 올바른 쿼리를 얻을 때까지 다른 쿼리를 직접 시도한 다음 C# 코드에 다시 넣습니다. 세 번째 가능성은 올바른 응답이 '행 없음'이며 코드에서이 사례를 올바르게 처리하는 방법을 알아야한다는 것입니다.

한편 dr.HasRows이 참이라고 가정합니다. dr.Read에 문제가 있거나 확인란을 추가하는 중 문제가 있습니다. 전자를 제거하려면 안쪽 루프에서 인쇄 줄을 사용해보십시오. 이번에는 관심있는 값을 출력합니다 :

Debug.Print("Value to be added is: " + dr[0].ToString()); 

이러한 것이 합리적인지 아닌지 신속하게 알 수 있습니다. 문제가 발생하면 checkListBox1으로 무엇이 잘못 될지 알아보십시오. 루프가 반복 될 때마다 checklistBox1 및/또는 checkListBox1.Items의 값을 인쇄하십시오. 다른 값, 가능한 문자열 상수 또는 하드 코드 된 문자열 목록을 Items으로 작성하고 작동하는지 확인하십시오. checkListBox1이 실제로 비어 있는지 확인하고 액세스하기 전에 코드를 실제로 채워야합니다.

잘 했으므로 두 가지 주요 디버깅 방법 중 하나의 주요 두 부분을 배웠습니다.

Console.WriteLine("x is currently equal to " + x.ToString()); 
(변수의 실제 값을 인쇄하여) 코드 (정보 인쇄 라인에 넣어) 루프와 가지 방법 당신은

Console.WriteLine("Got this far!"); 

식별 할 수 있으며 데이터의 값이 무엇인지 찾을 수 있습니다

인쇄 라인에 대한 좋은 점은 어떤 종류의 출력이나 로깅을 제어 할 때마다 다른 도구없이 이와 같이 디버깅 할 수 있다는 것입니다.

이제 코드의 각 단계를 테스트하고 전달 된 데이터를 관찰하고 그 결과를 확인합니다. 예상대로 작동하는 부품과 이전 단계에서 이미 전달 된 잘못된 정보를 사용하고있는 부품을 정확히 찾아보십시오. db 액세스와 같이 확실하지 않은 비트는 코드에서 사용 된 방식과 다른 방식으로 시도하고 다시 실행하십시오. 예를 들어, 수행 방법을 알고 있는지 확인하기 위해 ListCheckBox을 생성하고 표시하는 두 줄짜리 프로그램을 작성하십시오.

극단적으로 실험적인 도구를 사용하는 경우 버그가 발견 될 수 있으며 코드 자체가 문제가 될 수 있습니다. 이것은 광범위하게 시도하고 다른 사람들이 테스트 한 기술을 사용하여 수행중인 작업과 거의 일치하지 않습니다. 가장 가능성있는 결과는 (아마도 간단한) 버그를 찾아 고쳐야한다는 것입니다. 그것보다 더 작은 테스트 케이스를 사용하여 StackOverflow로 돌아와 컴포넌트를 사용하는 방식이나 직접적으로 파악하기 어려운 간단한 쿼리에 대해 묻는 것이 가능합니다. (Winforms와 SQL Server에는 많은 문제가있어 많은 사람들에게 도움이되는 좋은 질문이됩니다.) 할 때 디버깅 결과를 공유하여 답변자가 코드가 보이지 않는 곳을 정확하게 알 수 있습니다 예상대로 작동합니다. 이와 같은 문제가 발생하면 다른 누군가가 이미 발견되어 답변을 찾았 음을 알 수 있습니다.

디버깅이 끝나면 코드를 http://codereview.stackexchange.com 코드로 가져 가면 더 짧고 우아하고 성능이 뛰어나고 오류를 방지하는 방법에 대한 조언을 얻을 수 있습니다. 행운을 빕니다!

0

아래 명령 텍스트를 사용 시도하십시오 : 당신은 기본적으로 디버깅 할 수 있도록 코드를 요구하고

cmd.ComandText = "Select * from infor". 
관련 문제