2012-11-19 32 views
-1

我有這個代碼serous問題。我有方法GetWeatherItemData,它需要一個參數名稱和句點作爲從SQL數據庫獲取數據的輸入,它似乎工作正常。在C#中的for循環問題ADO網絡代碼

但我想創建一個方法,可以爲多個參數做同樣的工作,所以我創建了一個名爲GetSelectedWeatherItemsData的方法,它接受一個參數數組作爲輸入並循環通過我的第一個方法,但由於某種原因,它只會僅返回1個參數的數據,這是輸入參數數組中的第一個數據。

下面是第一方法:

public CustomDataType GetWeatherItemData(string parameterName, string fromTime, string toTime) 
{ 
     /* This method takes parameter name, start time and end time as input it will then return 
     * all the measurement values and their timestamp as array for the specific parameter   
     */ 
     CustomDataType getWeatherItemObj = new CustomDataType();   
     List<double> valueList = new List<double>(); 
     List<string> timeStampList = new List<string>(); 
     List<int> parameterIdList = new List<int>(); 
     List<string> ParameterNameList = new List<string>(); 

     try 
     { 
      using (conn = new SqlConnection(connectionString))// create and open a connection object 
      { 
       // 1. create a command object identifying the stored procedure 
       cmd = new SqlCommand("GetWeatherItemData", 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("@WeatherParameterName", 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()) 
        { 
         valueList.Add((double)reader["MeasurementValue"]); 
         timeStampList.Add(reader["MeasurementDateTime"].ToString()); 
         parameterIdList.Add((int)reader["WeatherParameterID"]);        
        } 
       } 

       //close connection 
       reader.Close(); 

       //changed to arrays to support webservices 
       getWeatherItemObj.arrayOfValue   = valueList.ToArray(); 
       getWeatherItemObj.arrayOfTimestamp  = timeStampList.ToArray(); 
       getWeatherItemObj.arrayOfParameterID = parameterIdList.ToArray();      

       for (counter = 0; counter < getWeatherItemObj.arrayOfValue.Length; counter++) 
       { 
        ParameterNameList.Add(GetParameterInfo(parameterName).ParameterName); 
       } 

       getWeatherItemObj.arrayOfParameterName = ParameterNameList.ToArray(); 
      } 
     } 
     catch (SqlException e) 
     { 
      Console.WriteLine("Connection failed"); 
      Console.WriteLine(e.Message); 
      Thread.Sleep(5000); 
     }   
     return getWeatherItemObj; 
    } 

這裏是我有問題的代碼。它需要一組參數名稱和句點作爲輸入。但它只返回輸入數組中第一個元素的數據,就好像它只對for循環執行一次並跳出。我通過給for循環分配一個固定數字,如parameterName[3]而不是parameterName[counter],測試了for循環內的代碼,我得到的數據不是第一個元素。所以出於某種原因,for循環只進行1次迭代。

public CustomDataType GetSelectedWeatherItemsData(string[] parameterName, string fromTime, string toTime) 
{ 
     CustomDataType tempObj;  
     List<double> valueList   = new List<double>(); 
     List<string> timeStampList  = new List<string>(); 
     List<int> paramIdStampList  = new List<int>(); 
     List<string> ParameterNameList = new List<string>(); 

     for (counter = 0; counter < (parameterName.Length); counter++) 
     { 
      tempObj = GetWeatherItemData(parameterName[counter], fromTime, toTime); 
      valueList.AddRange(GetWeatherItemData(parameterName[counter], fromTime, toTime).arrayOfValue); 
      timeStampList.AddRange(GetWeatherItemData(parameterName[counter], fromTime, toTime).arrayOfTimestamp); 
      //paramIdStampList.AddRange(tempObj.arrayOfParameterID); 
      ParameterNameList.AddRange(GetWeatherItemData(parameterName[counter], fromTime, toTime).arrayOfParameterName); 
     } 

     getSelectedItemsObj       = new CustomDataType(); 
     getSelectedItemsObj.arrayOfValue   = valueList.ToArray(); 
     getSelectedItemsObj.arrayOfTimestamp  = timeStampList.ToArray(); 
     //getSelectedItemsObj.arrayOfParameterID = paramIdStampList.ToArray(); 
     getSelectedItemsObj.arrayOfParameterName = ParameterNameList.ToArray(); 

     return getSelectedItemsObj; 
    } 
+0

你嘗試調試這個循環? – horgh

+0

應避免使用魔術字符串。 –

+0

是的,我通過設置parameterName [1]和其他元素的數字來測試循環,並且僅爲它們返回了數據。 – user1810659

回答

1

什麼似乎肯定是錯誤的事實,我們在調用簡單 Web服務Four的循環內多次 - 你爲什麼不直接稱之爲一次,然後用你回來的結果?

喜歡的東西:

for (counter = 0; counter < (parameterName.Length); counter++) 
{ 
    tempObj = GetWeatherItemData(parameterName[counter], fromTime, toTime); 

    valueList.AddRange(tempObj.arrayOfValue); 
    timeStampList.AddRange(tempObj.arrayOfTimestamp); 
    //paramIdStampList.AddRange(tempObj.arrayOfParameterID); 
    ParameterNameList.AddRange(tempObj.arrayOfParameterName); 
} 
+0

我也試過這個,它也只能得到1的第一個元素的數據 – user1810659

+0

@ user1810659你能否更詳細地解釋一下,你的意思是什麼*獲取第一個元素的數據*? – horgh