SqlDataReader while-loop中变量的覆盖

问题描述 投票:0回答:1

我已经阅读了一些看起来与此类似的线程,但是找不到解决我的问题的方法,我没有太多使用堆栈溢出,所以请耐心等待]

我有一个使用SqlDataReader的while循环,它从数据库中提取信息并将其放入如下所示的开发请求列表中

public ListOfDevelopmentRequestsModel GetDevRequests(List<SelectListItem> evaluators)
        {
            SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.GetDevRequests, Conn);
            cmd.CommandType = CommandType.StoredProcedure;
            ListOfDevelopmentRequestsModel ListOfDevRequests = new ListOfDevelopmentRequestsModel();
            Conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                DateTime requestDate = Convert.ToDateTime(reader["DateCreated"].ToString());
                string requestorFirstName = reader["Staff First Name"].ToString();
                string requestorLastName = reader["Staff Last Name"].ToString();
                string requestorEmailAddress = reader["Staff Email"].ToString();
                string solutionName = reader["SolutionName"].ToString();
                string solutionDescription = reader["SoultionDescription"].ToString();
                string solutionElementName = reader["SolutionElementName"].ToString();
                string solutionElementDescription = reader["SolutionElementDescription"].ToString();
                string itemToChange = reader["ItemChange"].ToString();
                string changeDetails = reader["ChangeDetail"].ToString();

                List<SelectListItem> evaluatorList = new List<SelectListItem>(DisplayCurrentEvaluator(evaluators, evaluator));

                DevelopmentRequestModel DevRequest = new DevelopmentRequestModel
                {
                    RequestDate = requestDate,
                    RequestorName = $"{requestorFirstName} {requestorLastName}",
                    RequestorEmailAddress = requestorEmailAddress,
                    SolutionName = solutionName,
                    SolutionDescription = solutionDescription,
                    SolutionElementName = solutionElementName,
                    SolutionElementDescription = solutionElementDescription,
                    ItemToChange = itemToChange,
                    ChangeDetails = changeDetails,
                    AccordionHeading = $"{(changeID.PadLeft(4, '0'))} - {requestorFirstName} {requestorLastName} - {itemToChange}"
                };

                ListOfDevRequests.DevelopmentRequests.Add(DevRequest);
            }
            Conn.Close();

            return ListOfDevRequests;
        }

我也有一个清单来获取请求的评估者

        public static List<SelectListItem> GetEvaluators()
        {
            List<SelectListItem> evaluators = new List<SelectListItem>();
            SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.GetEvaluators, Conn);
            cmd.CommandType = CommandType.StoredProcedure;
            Conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                evaluators.Add(
                    new SelectListItem
                    {
                        Text = reader["Staff Name"].ToString(),
                        Value = reader["Staff Code"].ToString(),
                    });
            }
            Conn.Close();
            return evaluators;
        }

最后,我具有一个列表,该列表将传递上述评估者列表,并从数据库中提取评估者:string evaluator = reader["Evaluator"].ToString();,并将根据评估者名称是否与文本值匹配来设置选择列表的默认值,并且将其设置为选定的选择列表项。

        public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> evaluators, string evaluator)
        {
            foreach (var item in evaluators)
            {
                if (item.Text == evaluator)
                {
                    item.Selected = true;
                }
                else
                {
                    item.Selected = false;
                }
            }

            return evaluators;

        }

问题是,循环中的第一项具有评估者“ Bill”,并且“ Bill”被选中,并且工作正常,但是循环中的第二项是“ John”,并且将“ John”设置为selected ,它将“ Bill”作为第一项中的选定值替换为“ John”

由于我尝试了多种修复方法,但最终陷入困境,但是我很沮丧,不胜感激。

很抱歉,如果帖子的格式不好看,我可以尝试重新格式化并根据需要提供更多信息。

欢呼声

编辑代码:

GetDevRequests()

 public ListOfDevelopmentRequestsModel GetDevRequests(List<SelectListItem> evaluators)
        {
            SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.GetDevRequests, Conn);
            cmd.CommandType = CommandType.StoredProcedure;
            ListOfDevelopmentRequestsModel ListOfDevRequests = new ListOfDevelopmentRequestsModel();
            Conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            List<SelectListItem> evaluatorList = new List<SelectListItem>();

            while (reader.Read())
            {
                string changeID = reader["ChangeID"].ToString();
                string evaluator = reader["Evaluator"].ToString();
                string status = reader["Status"].ToString();
                string priority = reader["Priority"].ToString();
                string eliteID = reader["RequestorID"].ToString();
                DateTime requestDate = Convert.ToDateTime(reader["DateCreated"].ToString());
                string requestorFirstName = reader["Staff First Name"].ToString();
                string requestorLastName = reader["Staff Last Name"].ToString();
                string requestorEmailAddress = reader["Staff Email"].ToString();
                string solutionName = reader["SolutionName"].ToString();
                string solutionDescription = reader["SoultionDescription"].ToString();
                string solutionElementName = reader["SolutionElementName"].ToString();
                string solutionElementDescription = reader["SolutionElementDescription"].ToString();
                string itemToChange = reader["ItemChange"].ToString();
                string changeDetails = reader["ChangeDetail"].ToString();

                evaluatorList = DisplayCurrentEvaluator(evaluators, evaluator);

                DevelopmentRequestModel DevRequest = new DevelopmentRequestModel
                {
                    ChangeID = (changeID.PadLeft(4, '0')),
                    Evaluator = evaluator,
                    Evaluators = evaluatorList,
                    Status = status,
                    Priority = priority,
                    EliteID = eliteID,
                    RequestDate = requestDate,
                    RequestorName = $"{requestorFirstName} {requestorLastName}",
                    RequestorEmailAddress = requestorEmailAddress,
                    SolutionName = solutionName,
                    SolutionDescription = solutionDescription,
                    SolutionElementName = solutionElementName,
                    SolutionElementDescription = solutionElementDescription,
                    ItemToChange = itemToChange,
                    ChangeDetails = changeDetails,
                    AccordionHeading = $"{(changeID.PadLeft(4, '0'))} - {requestorFirstName} {requestorLastName} - {itemToChange}"
                };

                ListOfDevRequests.DevelopmentRequests.Add(DevRequest);
            }
            Conn.Close();

            return ListOfDevRequests;
        }

DisplayCurrentEvaluator()

        public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> selectListItems, string selectListDefaultItem)
        {
            foreach (var item in selectListItems)
            {
                item.Selected = item.Text == selectListDefaultItem;
            }

            return selectListItems;

        }
c# while-loop sqldatareader
1个回答
0
投票

问题在此行:

List<SelectListItem> evaluatorList = new List<SelectListItem>(DisplayCurrentEvaluator(evaluators, evaluator));

首先,这也可以写成

List<SelectListItem> evaluatorList = DisplayCurrentEvaluator(evaluators, evaluator);

您的DisplayCurrentEvaluator已经返回了正确的列表,因此无需将其复制到新列表中。

但是这是次要的要点,就我所知,您不使用该evaluatorList。在该while循环的每次迭代中,您都在创建一个新的(可能不是您想要的),然后您就忘了它。我也看不到evaluator设置在哪里,但这可能是在您未显示的代码中。

因此,您需要在循环之外一次生成此列表,并将其保存(可能在类级字段或属性中。)>

还有一个提示,该DisplayCurrentEvaluator方法也可以写成

public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> evaluators, string evaluator)
{
    foreach (var item in evaluators)
    {
        item.Selected = item.Text == evaluator;
    }

    return evaluators;
}
EDIT
设置evaluator,并使用得到的evaluatorList您的DisplayCurrentEvaluator更新原始的评估者列表并返回它。这有效地导致每个evaluatorList指向相同的列表,最后一个更新将赢得该列表。因此,请确保您返回一个新列表。

public List<SelectListItem> DisplayCurrentEvaluator(List<SelectListItem> evaluators, string evaluator) { var result = new List<SelectListItem>(evaluators.Count); foreach (var item in evaluators) { result.Add(new SelectListItem { Text = item.Text, Value = item.Value, Selected= item.Text == evaluator}; } return result; }

另外,在循环内部声明evaluatorList(仅)。

var evaluatorList = DisplayCurrentEvaluator(evaluators, evaluator);

© www.soinside.com 2019 - 2024. All rights reserved.