我有这个代码,我得到错误,并且无法理解为什么我得到错误。代码如下:im使用两个数组一个字符串和一个double(数据值及其相应的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;
}
答案 0 :(得分:2)
问题在于你如何对待你的柜台。如果你删除时间戳的东西,计数器永远不会真正被修改,所以它似乎都可以工作,但如果你有时间戳的东西,那么你的for循环初始化器看起来像这样:
for (counter = 0; counter < tableSize; counter++)
tableSize
最终大于parameterName[].Length
。由于后来你正在调用parameterName[counter]
,因此计数器将超出范围。您需要确保您永远不会尝试通过在该数组中不合法的索引访问parameterName[]
中的内容。
编辑:
另一种可能性,如果删除仅该行删除错误,则返回
GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;
大于
中指定的指定数组getSelectedItemsObj.arrayOfTimeStamp = new string[tableSize];
为了做出这样的决定,您还需要将代码发布到该方法。
答案 1 :(得分: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
,您就会收到错误。
答案 2 :(得分: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
,因此arrayOfValue
和arrayOfTimeStamp
不是数组。然后,您可以传递CustomDataType
甚至CustomDataType[]
,而不是传递List<CustomDataType>
。