2014-03-03 63 views
0

我有一個for循環,我用它來獲取列表項以顯示在我的線形圖中。這很簡單,但我得到一個索引超出範圍的錯誤。我理解在for循環中發生的事情的方式是,只要我少於indexCount()就可以繼續計數。我爲什麼要通過我的索引方法?我研究並使用了斷點沒有找到,我=我的集合大小。For循環沒有正確地返回索引

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

你看它與斷點? –

+2

'points.Count'和'chartData.indexCount()'可能會有所不同。如果第二個更大,那麼顯然你會得到'IndexOutOfRangeException'。 –

+3

循環到'points.Count'而不是'chartData.indexCount()'會更安全。 – TypeIA

回答

1

首先,我會建議使用ExecutrScalar而不是ExecuteReader。

其次,你有點 - 列表知道它有多少項目(計數屬性)....至少使用Math.Min,以確保你沒有溢出你的名單。

就像一個很好的建議 - 不要關閉讀者對象(或實現IDisposable的任何對象)。取而代之的是,申報對象在using語句:

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

最後一點 - 不要叫indexCount在每個迭代上...只是它的結果保存到一個變量...