1

我有这段代码,我得到错误,并且无法理解为什么我得到错误。代码如下:我使用两个数组一个字符串和一个双精度(数据值及其对应的tinestamp)。但由于某种原因,我收到错误:这一行的索引超出范围错误:

     getSelectedItemsObj.arrayOfTimeStamp        = GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;

如果我删除这一行并且只使用 arrayOfValue 代码工作正常,但我需要两者

.......... 感谢您的快速回复,这是 GetItemData 的设置方式

 public CustomDataType GetItemData(string parameterName, string fromTime, string toTime)
    {

        getWeatherItemObj = new CustomDataType();
        // get the parameter ID
        prameterID = GetParameterInfo(parameterName).ParameterID; 
        //get the nr of items to size value arrays
        tableSize = GetTableSize(parameterName, fromTime, toTime, prameterID);
        getWeatherItemObj.arrayOfValue      = new double[tableSize];            
        getWeatherItemObj.arrayOfTimeStamp  = new string[tableSize];
        counter = 0;
        try
        {
            using (conn = new SqlConnection(connectionString))// create and open a connection object
            {
                // 1. create a command object identifying the stored procedure
                 cmd = new SqlCommand("GetItemData", conn);
                // 2.Let the command object know we will execute a stored procedure
                cmd.CommandType = CommandType.StoredProcedure;
                // 3. add the 3 parameters to command, so the can be passed to the stored procedure                  
                cmd.Parameters.Add("@ParameterName", SqlDbType.VarChar).Value    = parameterName;
                cmd.Parameters.Add("@FromTime", SqlDbType.VarChar).Value                = fromTime;
                cmd.Parameters.Add("@ToTime", SqlDbType.VarChar).Value                  = toTime;
                //open connection
                conn.Open();
                // execute the command
                reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        getWeatherItemObj.arrayOfValue[counter]         = (double)reader["MeasurementValue"];
                        getWeatherItemObj.arrayOfTimeStamp[counter]     = reader["MeasurementDateTime"].ToString();                          
                        counter++;
                    }
                } 
                //close connection
                reader.Close();            
            }
        }
        catch (SqlException e)
        {
            Console.WriteLine("Connection failed");
            Console.WriteLine(e.Message);
            Thread.Sleep(5000);
        }           
        return getWeatherItemObj;
    }






 class CustomDataType
{
    public double[] arrayOfValue;
    public string[] arrayOfTimeStamp;

}

public CustomDataType GetSelectedtemsData(string[] parameterName, string fromTime, string toTime)
    {
        numberOfParameters = parameterName.Length;//Get the number of given parameters
        tableSize = 0;
        for (counter = 0; counter < numberOfParameters; counter++)
        {
            tableSize = tableSize + GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp.Length;               
        }

        getSelectedItemsObj = new CustomDataType();

        getSelectedItemsObj.arrayOfValue        = new double[tableSize];
        getSelectedItemsObj.arrayOfTimeStamp    = new string[tableSize];
        for (counter = 0; counter < tableSize; counter++)
        { 
            getSelectedItemsObj.arrayOfValue            = GetItemData(parameterName[counter], fromTime, toTime).arrayOfValue;
            getSelectedItemsObj.arrayOfTimeStamp        = GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;

        }
        return getSelectedItemsObj;
    }
4

3 回答 3

2

问题在于你如何对待你的柜台。如果你删除时间戳的东西,计数器永远不会真正被修改,所以一切似乎都可以工作,但如果你有时间戳的东西,那么你的 for 循环初始化程序如下所示:

for (counter = 0; counter < tableSize; counter++)

其中tableSize最终大于parameterName[].Length。由于稍后您调用parameterName[counter], counter 将超出范围。您需要确保您永远不会尝试parameterName[]通过该数组中不合法的索引来访问其中的某些内容。

编辑:
另一种可能性,如果删除该行会删除错误,则返回

GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;

大于分配的指定数组

getSelectedItemsObj.arrayOfTimeStamp    = new string[tableSize];

为了做出这样的决定,您还需要将代码发布到该方法。

于 2012-11-12T19:42:26.570 回答
2

问题就在这里:

for (counter = 0; counter < tableSize; counter++)
{ 
     getSelectedItemsObj.arrayOfValue            = GetItemData(parameterName[counter], fromTime, toTime).arrayOfValue;
     getSelectedItemsObj.arrayOfTimeStamp        = GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;    
}

您的counter大小正在根据 增加tableSize,但它的使用好像基于 的大小parameterName。您的代码中没有任何内容强制执行此假设,因此一旦tableSize大于parameterName,您将收到您所看到的错误。

于 2012-11-12T19:42:43.903 回答
1

请尝试以下方法:

public CustomDataType GetSelectedtemsData(string[] parameterName, string fromTime, string toTime)
{
    CustomDataType tempObj;     // *Rename this variable*
    List<double> valueList = new List<double>();
    List<string> timeStampList = new List<string>();

    for (counter = 0; counter < parameterName.Length; counter++)
    {
        tempObj = GetItemData(parameterName[counter], fromTime, toTime);
        valueList.AddRange(tempObj.arrayOfValue);
        timeStampList.AddRange(tempObj.arrayOfTimeStamp);
    }

    getSelectedItemsObj = new CustomDataType();
    getSelectedItemsObj.arrayOfValue = valueList.ToArray();
    getSelectedItemsObj.arrayOfTimeStamp = timeStampList.ToArray();

    return getSelectedItemsObj;
}

我打算按照你的方式尝试,但是一旦我意识到你将每个 parameterName 拉 3 次,第二个循环将需要一个内部循环(因为你需要遍历每个 GetItemData 中的每个索引),我的修复将无论如何都会导致相同数据的多个副本;我决定使用两个List.

如果这不能解决您的问题,那么我将需要完整的错误消息、错误消息中的堆栈跟踪以及错误堆栈上最顶层方法的代码。

注意:有许多额外的优化可能会帮助您喜欢:

  • 您可能还想更新GetItemData为也使用List而不是数组,这样您就可以跳过该tableSize = GetTableSize(parameterName, fromTime, toTime, prameterID);行。
  • 你可能想改变CustomDataType所以arrayOfValuearrayOfTimeStamp不是数组。然后,CustomDataType您可以通过 aCustomDataType[]甚至List<CustomDataType>.
于 2012-11-12T21:49:48.437 回答