2017-08-04 126 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将超出数组的末尾,并且会得到“索引超出范围”异常。

您需要调试代码和查询以找出返回的行数与您阵列中元素数量不匹配的原因。

相关问题