2017-08-04 52 views
1

我得到以下例外情況在我的代碼如何解決索引超出範圍。必須是非負數且小於集合的大小。錯誤

Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

我不明白爲什麼它是拋出該異常。

流量的程序是這樣的:

我有一些收藏說1到200的每一個數字的集合,它會和運行下面的代碼。直到120,它沒有拋出例外,但是對於121,拋出了例外。而且它是隨機的,如果再次運行該程序,我可能會得到同樣的例外123.

可能是什麼原因?它與數據庫連接有關嗎?我的代碼有問題嗎?如果是這樣,那麼它不應該第一次迭代?

我曾嘗試:

public DataTable GetGrade(DataTable dtReportTbl) 
     { 
      dtReportTbl.Columns.Add("Salary_Grade", typeof(System.String)); 
      dtReportTbl.Columns.Add("InsertedDate", typeof(DateTime)); 
      string query = "select Grade from student_grade where myTable in ('JMS','JSM') and student_Num in ({StudentNums}) order by student_Num"; 
  
      try 
      { 
       using (OracleConnection con = new OracleConnection(connectionString)) 
       { 
        List<string> storeNums = new List<string>(); 
  

        foreach (DataRow row in dtReportTbl.Rows) 
        { 
         storeNums.Add(row["store"].ToString()); 
        } 
  
        var cmd = new OracleCommand(query, con); 
  
        // extension method to get StudentNums as to achieve cmd.Parameters.Add(new OracleParameter("pStudentNums", studentNum) 
        cmd.AddArrayParametersOra(storeNums, "StudentNums"); 
  
        var rdr = cmd.ExecuteReader(); 
        List<string> salGradelist = new List<string>(); 
        while (rdr.Read()) 
        { 
         salGradelist.Add(rdr["Grade"].ToString()); 
        } 
  
        int i = 0; 
        foreach (DataRow row in dtReportTbl.Rows) 
        { 
         row["Grade"] = salGradelist[i]; 
         row["RecordInsertedDate"] = DateTime.Today; 
         i++; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
  
      return dtReportTbl; 
     } 
+2

代碼中的哪一行會引發異常? – Sach

+0

讓我猜一猜;你使用'rdr'填充'salGradelist',然後你在'foreach'循環中使用'i'來從中獲取數據。現在,如果'salGradeList'中的項目數量與'dtReportTbl'中的項目數量不同,您將得到一個超出範圍的異常。 – Sach

+0

@Sach - 謝謝你。以下是Farhad Bagherlo的答案。我建議閱讀有用的很多。 – Elay

回答

2

爲了找到答案,你需要看數據你的應用程序在運行時 - 我們可以;噸做到這一點! 所以,它將取決於你。 在方法的第一行放置一個斷點,然後通過調試器運行代碼。然後看看你的代碼,並在你的數據,並找出應該發生什麼手動。然後每一行檢查一下你預期發生的事情究竟是什麼。如果不是這樣,那麼當你遇到問題時,你可以回溯(或再次運行並仔細觀察)來找出原因。

最可能的原因是查詢返回的行數與數組中元素的數量不同。

int i = 0; 
foreach (DataRow row in dtReportTbl.Rows) 
{ 
    ... = salGradelist[i]; // <-- Exception here 
    ... 
    i++; 
} 

如果查詢返回的數組數少於您數組中的元素數,那麼您的代碼將忽略後面的元素。

但是,如果它返回更多的行,那麼變量i將超出數組的末尾,並且會得到「索引超出範圍」異常。

您需要調試代碼和查詢以找出返回的行數與您陣列中元素數量不匹配的原因。

相關問題