2012-11-12 104 views
1

我有這個代碼即時獲取錯誤,並不能理解爲什麼即時通知錯誤。代碼如下:即時通訊使用兩個數組一個字符串和一個雙(數據值與他們相應的時間戳)。但由於某些原因,即時得到錯誤:索引超出這條線界失誤:數組索引越界錯誤C#

 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

什麼行代碼拋出異常? –

+0

也許是因爲'counter'>'parameterName'的長度?當你甚至不顯示數據來自哪裏(比如'parameterName')或者你的代碼甚至在做什麼(即'GetItemData')時,你是否真的認爲可以調試一個問題? – mellamokb

+1

請提供:錯誤完成消息,錯誤的堆棧跟蹤以及您編寫的錯誤堆棧跟蹤(可能是'arrayOfTimeStamp')上方法最高的代碼。 – Trisped

回答

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; 
} 

我會嘗試一下你的方式,但一旦我意識到你是拉各參數名稱3次,第二個循環需要一個內部循環(因爲你會需要迭代每個GetItemData中的每個索引),並且我的修復程序無論如何都會導致相同數據的多個副本;我決定使用兩個List重建該方法。

如果這不能解決您的問題,那麼我將需要完整的錯誤消息,錯誤消息中的堆棧跟蹤以及錯誤堆棧中最頂端方法的代碼。

注:有一些額外的優化,這可能會幫助你喜歡:

  • 您可能還需要更新GetItemData也使用List代替陣列,所以你可以跳過tableSize = GetTableSize(parameterName, fromTime, toTime, prameterID);線。
  • 您可能需要更改CustomDataType所以arrayOfValuearrayOfTimeStamp不是數組。然後,強似一CustomDataType出來,你可以通過一個CustomDataType[]甚至List<CustomDataType>
+0

感謝一百萬次!!,即時通訊新的.net環境,所以我不熟悉列表。但對我來說最奇怪的是,GetItemData從數據庫過程返回兩個相同大小的數組,並且仍然出現這種錯誤。現在可以正常使用List,再次非常感謝! – user1810659

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]; 
分配指定的數組較大

爲了做出這樣的決定,您需要將代碼發佈到該方法。

+0

打了我18秒 – Tyrsius

+0

正如我在Tyrsius的回答中所指出的,在我看來,OP說它工作,如果他刪除'arrayOfTimeStamp'行。由於'arrayOfValue'和'arrayOfTimeStamp'行都包含'parameterName [counter]'我期望這不是OP的解決方案。我同意這是一個需要修正的問題。 – Trisped

+0

@Trisped:鑑於OP選擇不與我們共享GetItemData的內部工作,這是可用數據提供的最佳答案。我會用另一種可能性發佈一個編輯,但這是剪切猜想。 –

2

的問題就在這裏:基於tableSize

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

counter規模遞增,但其被用作如果基於對parameterName大小。您的代碼中沒有任何內容會強制執行此假設,因此只要tableSize大於parameterName,您將看到您所看到的錯誤。

+0

對我來說,他說,如果他刪除'arrayOfTimeStamp'行,它就可以工作。由於'arrayOfValue'和'arrayOfTimeStamp'行都包含'parameterName [counter]'我期望這不是OP的解決方案。我同意這是一個需要修正的問題。 – Trisped

+0

@Trisped如果我知道'GetItemData'做了什麼,我可以評論一下。但他沒有發佈,所以你的猜測和我一樣好。 – Tyrsius