索引超出了 MSCORLIB.DLL 中的数组范围

Posted

技术标签:

【中文标题】索引超出了 MSCORLIB.DLL 中的数组范围【英文标题】:Index was outside the bounds of the array in MSCORLIB.DLL 【发布时间】:2017-06-08 18:02:15 【问题描述】:

如果我找到解决方案,我会感到惊讶,因为它非常具体和模糊,但我想我会尝试。我会尽量提供尽可能多的信息,因为我一直在寻找答案。

我正在用 C# 构建一个实用程序,它从 i-series/AS400 上的库中的文件中复制记录,并构建一个加密文本文件,其中 AS400 中的每条记录作为逗号分隔的字符串。在文件中,它将具有文件名、fieldvalue1、fieldvalue2、fieldvalue3 等值。然后,我将该文本文件带到另一台 PC,并运行一个 C# 实用程序,该实用程序将该记录复制到另一台 i 系列机器上的库中的相同文件名中。不幸的是,在某些情况下,我收到了数组异常的外部边界,但我无法确定原因。在异常之前的记录中,记录看起来几乎相同并且工作正常。简而言之,我的代码如下。我通常不会放弃,但我不指望能解决这个问题。如果有人这样做,我今晚可能会唱卡拉OK。

// Select records from AS400 file and write them to text file
Recordset rs = new Recordset();
sqlQuery = "SELECT * FROM " + dataLibrary + "." + fileName;

try

    rs.Open(sqlQuery, con);

    while (!rs.EOF)
    
        int[] fieldLengths;
        fieldLengths = new int[rs.Fields.Count];
        String[] fieldValues;
        fieldValues = new String[rs.Fields.Count];
        String fullString = "";

        for (i = 0; i < rs.Fields.Count; i++)
        
            fieldLengths[i] += rs.Fields[i].DefinedSize;
            fieldValues[i] += rs.Fields[i].Value;
        

        fullString = fileName + "," + String.Join(",", fieldValues);
        fullString = Functions.EncryptString(fullString);

        File.AppendAllText(savefile.FileName, fullString + Environment.NewLine);
        rs.MoveNext();
    

catch (Exception ex)



cmd.Dispose();
// This gives me a text file of filename, fieldvalue1, fieldvalue2, etc...
// Next, I take the file to another system and run this process:

while ((myString = inputFile.ReadLine()) != null)

    int stringLength = myString.Length;
    String[] valuesArray = myString.Split(',');

    for (i = 0; i < valuesArray.Length; i++)
    
        if (i == 0)
        
            fileName = valuesArray[0];
            // Create file if it doesn't exist already
            createPhysicalFile(newLibrary, fileName);
            SQLStatement = "INSERT INTO " + newLibrary + "." + fileName + "VALUES(";
        
        else
        
            if (i == valuesArray.Length - 1)
            
                SQLStatement += "@VAL" + i + ")";
            
            else
            
                SQLStatement += "@VAL" + i + ", ";
            
        
    

    try
    
        using (connection)
        
            try
            
                connection.Open();
            
            catch (Exception ex)
            
            

            // Create a new SQL command
            iDB2Command command = new iDB2Command(SQLStatement, connection);

            for (i = 1; i < valuesArray.Length; i++)
            
                try
                
                    command.Parameters.AddWithValue("@VAL" + i, (valuesArray[i]));
                
                catch (Exception ex)
                

                
            

            // Just split the array into a string to visually check 
            // differences in the records
            String arraySplit = ConvertStringArrayToString(valuesArray);

            // The query gets executed here.  The command looks something
            // like:  
            // INSERT INTO LIBNAME.FILENAME VALUES(@VAL!, @VAL2, @VAL3, @VAL4)
            // There are actually 320 fields in the file I'm having a problem with, 
            // so it's possible I'm overlooking something.  I have narrowed it down to 
            // field # 316 when the exception occurs, but in both cases 
            // field 316 is blanks (when it works and when it doesn't).
            command.ExecuteNonQuery();
        
    
    catch (Exception ex)
    
        // Here I get the exception out of bounds error in MSCORLIB.DLL. 
        // Some records are added fine, while others cause this exception.
        // I cannot visibly tell any major differences, nor do I see any  
        // errors in the AS400 job log or anything in C# that would lead me 
        // down a certain path.
        String error = ex.Message;
    

【问题讨论】:

您收到错误消息的原因只有一个,与 MSCORLIB 无关(这正是引发异常的地方)。它在您的代码中,这是因为您正在读取一个数组的边界之外,这意味着您需要使用调试器来确定代码的哪一部分超出了fieldLengths、@987654323 的边界@、rs.FieldsvaluesArray。我们无法为您执行此操作,因为我们没有来自 rs.Open 的查询结果可用于执行此操作。引发该异常的其他原因为零。 为什么不启动调试器并单步执行此代码?我们无法为您执行此操作,因为这是发现您的代码失败的确切位置的最简单方法。 我猜你没有检查数组长度是否非零。您是否使用调试器验证了哪一行引发了异常?逐行遍历它,直到你击中它。 当您在其中时,您不妨抽出fieldLengths 变量,因为它从未使用过。或者问题是它应该在某处使用而它不是? 为什么你的数组在某些地方是 0 索引,但在导致你悲伤的循环中是 1 索引? 【参考方案1】:

对于它的价值,我发现这发生在系统中的一个较小的文件中,并且在对代码和网络进行了艰苦的研究之后,我能够弄清楚发生了什么。基本上,文件文件在 i 系列上具有数字字段。不知何故,记录被写入原始系统上的文件,数字字段中的值为空,而不是数值。在存储原始记录时,我不得不做这样的计算:

String fieldType = rs.Fields[i].Type.ToString();
object objValue = rs.Fields[i].Value;
if (fieldType == "adNumeric" && objValue is DBNull)

  fieldValues[i] += "0";

else

  fieldValues[i] += rs.Fields[i].Value;

在此之后,如果在其中一个数字字段中发现空值,它只是将“0”放在它的位置,以便在写入新机器时,它会在其中放置一个有效的数字字符并继续写入其余的值。感谢所有的建议和精神上的支持。 :)

【讨论】:

以上是关于索引超出了 MSCORLIB.DLL 中的数组范围的主要内容,如果未能解决你的问题,请参考以下文章

将类添加到列表 C# 时,索引超出了数组的范围

javascript数组中的索引超出范围

数组中的下一个和索引超出范围

从firebase删除时数组索引超出范围

数据源数组正确时 UICollectionView 中的“索引超出范围”错误

将 Slider 值绑定到 EnvironmentObject 中的嵌套数组时,索引超出范围