1

エラーが発生するこのコードがあり、なぜエラーが発生するのか理解できません。コードは次のとおりです。文字列と倍精度の 2 つの配列 (データ値と対応するタイムスタンプ) を使用しています。しかし、何らかの理由で、次のエラーが発生します:この行の範囲外のインデックスエラー:

     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]、カウンターは範囲外になります。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 回プルしていることに気付きました。とにかく、同じデータの複数のコピーが作成されました。two を使用してメソッドを再構築することにしましたList

これで問題が解決しない場合は、完全なエラー メッセージ、エラー メッセージからのスタック トレース、およびエラー スタックの最上位のメソッドのコードが必要になります。

注: あなたが好きになるのに役立つ追加の最適化がいくつかあります:

  • 行をスキップできるように、配列の代わりにGetItemData使用するように更新することもできます。ListtableSize = GetTableSize(parameterName, fromTime, toTime, prameterID);
  • CustomDataTypeそのように変更したい場合があり、配列ではありませんarrayOfValuearrayOfTimeStamp次に、CustomDataTypeout を渡す代わりに、CustomDataType[]orを渡すこともできますList<CustomDataType>
于 2012-11-12T21:49:48.437 に答える