如何解决索引超出范围的问题。必须为非负数且小于集合的大小。错误

Ela*_*lay 5 c# database oracle datatable

我的代码中出现以下异常

\n\n
Index was out of range. Must be non-negative and less than the size of the collection.\nParameter name: index\n
Run Code Online (Sandbox Code Playgroud)\n\n

我无法理解为什么它会抛出该异常。

\n\n

程序流程是这样的:

\n\n

我有数字集合,例如 1 到 200。对于集合中的每个数字,它都会运行以下代码。直到120,它没有抛出异常,但是对于121,它抛出异常。而且它是随机的,如果再次运行该程序,我可能会得到与 123 相同的异常。

\n\n

可能是什么原因?与数据库连接有关吗?我的代码有问题吗?如果是这样,那么它不应该在第一次迭代中抛出吗?

\n\n

我尝试过的:

\n\n
public DataTable GetGrade(DataTable dtReportTbl)\n        {\n            dtReportTbl.Columns.Add("Salary_Grade", typeof(System.String));\n            dtReportTbl.Columns.Add("InsertedDate", typeof(DateTime));\n            string query = "select Grade from student_grade where myTable in (\'JMS\',\'JSM\') and  student_Num in ({StudentNums}) order by student_Num";\n\xc2\xa0\n            try\n            {\n                using (OracleConnection con = new OracleConnection(connectionString))\n                {\n                    List<string> storeNums = new List<string>();\n\xc2\xa0\n\n                    foreach (DataRow row in dtReportTbl.Rows)\n                    {\n                        storeNums.Add(row["store"].ToString());\n                    }\n\xc2\xa0\n                    var cmd = new OracleCommand(query, con);\n\xc2\xa0\n                    // extension method to get StudentNums as to achieve cmd.Parameters.Add(new OracleParameter("pStudentNums", studentNum)\n                    cmd.AddArrayParametersOra(storeNums, "StudentNums");\n\xc2\xa0\n                    var rdr = cmd.ExecuteReader();\n                    List<string> salGradelist = new List<string>();\n                    while (rdr.Read())\n                    {\n                        salGradelist.Add(rdr["Grade"].ToString());\n                    }\n\xc2\xa0\n                    int i = 0;\n                    foreach (DataRow row in dtReportTbl.Rows)\n                    {\n                        row["Grade"] = salGradelist[i];\n                        row["RecordInsertedDate"] = DateTime.Today;\n                        i++;\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                throw;\n            }\n\xc2\xa0\n            return dtReportTbl;\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

Far*_*rlo 4

要找到答案,您需要在应用程序运行时查看应用程序中的数据 - 而我们不能这样做!所以,这将取决于你。在方法的第一行放置一个断点,然后通过调试器运行代码。然后查看您的代码和数据并找出应该手动发生的情况。然后单步执行每一行,检查您期望发生的情况是否确实发生。如果不是,那就是你遇到了问题,你可以回溯(或再次运行它并更仔细地查看)以找出原因。

最可能的原因是查询返回的行数与数组中的元素数不同。

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

如果查询返回的行数少于数组中元素的数量,那么您的代码将忽略后面的元素。

但如果它返回更多行,那么变量 i 将超出数组的末尾,并且您将得到“索引越界”异常。

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