2014-03-03 4 views
0

저는 회선 그래프에 표시하기 위해 목록 항목을 가져 오는 데 사용하는 for 루프가 있습니다. 그것은 매우 간단하지만 색인이 범위 오류를 벗어났습니다. 내가 for 루프에서 일어나는 일을 이해하는 방식은 i가 적 으면 indexCount()가 계속 카운트를 유지하는 한 길다. 왜 내 인덱스 방법을 지나가고 있습니까? 내가 연구하고 사용 중단 점을 아무것도 발견하고 난 = 내 컬렉션 크기.루프가 인덱스를 제대로 반환하지 않습니다.

List<ChartData> points = ChartData.getData(); 
    for (int i = 0; i < chartData.indexCount(); i++) 
    { 
     series0.AddItem(points[i].Produced); 
     series1.AddItem(points[i].Labeled); 
     RadChart1.PlotArea.XAxis.Items.Add(new ChartAxisItem(points[i].CasesLabeled.ToString())); 
    } 

대부분의 행을 표시 할 수 있도록 사용자 지정 색인을 만들었습니다. 따라서 chartData.indexCount() 메서드가 있습니다. 내 indexCount 메소드가 여기 뭔가 잘못되었습니다.

public int indexCount() 
{ 

    StringBuilder sqlString = new StringBuilder(); 
    sqlString.Append("SELECT Count(Number) FROM SomeDB.dbo.Order"); 

    SqlDataReader reader = null; 
    SqlConnection dbConn = DBHelper.getConnection(); 

    try 
    { 
     reader = DBHelper.executeQuery(dbConn, sqlString.ToString(), null); 
     if (reader != null) 
     { 
      while (reader.Read()) 
      { 
       number = reader.GetInt32(0); 
      } 
     } 
     reader.Close(); 
     reader.Dispose(); 
     dbConn.Close(); 
     dbConn.Dispose(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    return number; 
} 
+0

당신은 그것의 중단 점으로 봤어 ... 그냥 변수에 그 결과를 저장 ... 모든 반복에 indexCount를 호출하지 않습니다? –

+2

'points.Count'와'chartData.indexCount()'는 다를 수 있습니다. 두 번째 것이 더 크면 분명히'IndexOutOfRangeException'을 얻게 될 것입니다. –

+3

'chartData.indexCount()'대신'points.Count'를 반복하는 것이 더 안전합니다. – TypeIA

답변

1

먼저 ExecuteReader 대신 ExecutrScalar를 사용하는 것이 좋습니다.

둘째, 포인트 목록이 있습니다. 그 목록에는 아이템의 개수 (Count 속성)가 있습니다. 적어도 Math.Min을 사용하여 목록이 넘치지 않도록하십시오.

마찬가지로 좋은 조언 - 독자 개체 (또는 IDisposable을 구현하는 개체)를 닫지 마십시오. 대신 문을 사용하여 객체를 선언 : 마지막으로

using (reader = DBHelper.executeQuery(dbConn, sqlString.ToString(), null)) 
{ 
    // code which using reader 
} 

와 -

관련 문제