-1

このコードには深刻な問題があります。GetWeatherItemDataSQL データベースからデータを取得するための入力としてパラメーター名とピリオドを受け取るメソッドがあり、正常に動作しているようです。

しかし、複数のパラメーターに対して同じ作業を実行できるメソッドを作成したいので、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 ループを 1 回だけ実行して飛び出すかのように、入力配列の最初の要素のデータのみを返しますparameterName[3]parameterName[counter]最初の要素ではなく、その要素のデータを取得しました。そのため、何らかの理由で 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;
    }
4

1 に答える 1

1

間違いなく間違っていると思われるのは、ループ内で単純なWebサービスを4回呼び出しているという事実です。一度呼び出してから、戻ってきた結果を使用してみませんか?

何かのようなもの:

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);
}
于 2012-11-19T06:45:11.033 に答える