Tshumore Ответов: 1

C# foreach-цикл, пропускающий некоторые значения во время итерации


У меня есть элемент управления multi-select, в котором мне нужно зафиксировать все выбранные элементы в таблице SQL Server. Этот вопрос связан с тем, чего я пытаюсь здесь достичь https://www.codeproject.com/Questions/5254981/How-do-I-resolve-error-cannot-convert-char-to-int
Когда я отправляю форму, фиксируется только 1 элемент, хотя при проверке с помощью шагового отладчика все выбранные значения действительно заполняются переменной employeees4 (прилагаемое изображение). Я заметил, что только первый пункт в отборе становится совершенным. Какая-нибудь помощь в том, что я могу упустить?

Пожалуйста, обратите внимание, что я использовал немного другие имена переменных в прилагаемом отладочном образе, но код остается тем же самым.

Я также внес изменения в реализацию проекта :
1. Добавил вспомогательный метод, который преобразует строку массива в строку. (ConvertStringArrayToString)
2. разделение результирующей строки на отдельные элементы.

В контроллере у меня есть:
 [HttpPost]
    public ActionResult NewOverTimeRequest(FormCollection formcollection)
    {

        Models.Employee.OverTimeRequest request = new Models.Employee.OverTimeRequest();
         try
        {

            var batch = new OvertimeBatch();
            request.employees = GetEmployees();

            request.EmployeeNumber = new string[] { Convert.ToString(formcollection["EmployeeNumber"]) };
            var employeees1= request.EmployeeNumber.Split(',');                
            string[] employeees2 = employeees.SingleOrDefault().ToArray();
            string employeees3 = Helpers.ConvertStringArrayToString( employeees2);
            string[] employeees4 =employeees3.Split(new char[] { ',' });
            if (ModelState.IsValid)
            {
                foreach ( string emp in employeees4)
                {
                    using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
                    {

                        SqlCommand cmd = new SqlCommand("SubmitOverTime", conn);
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@EmpNum", emp);
                        cmd.Parameters.AddWithValue("@DateDone", DateTime.Now);
                        conn.Open();
                        cmd.ExecuteNonQuery();
                    }

                }
                  return RedirectToAction("OverTime");
            }
            catch (Exception ex)
        {
            ViewBag.ErrorMessage = ex.Message;
            return View(request);
        }

        return RedirectToAction("OverTime");

       }
}


Модель
[Required]
    [Display(Name = "Employee ")]
    public string[] EmployeeNumber { get; set; }
    public Employee Employee { get; set; }
    public String DisplayName { get; set; }
    public IEnumerable<SelectListItem> employees { get; set; }


Я прикрепил свою отладку здесь : https://drive.google.com/open?id=1HvY6swhfdTyzBpcFRJE511_LHREOltbH

Что я уже пробовал:

Я попытался пройти через поток программы , значения действительно заполняются employeees4, но каким-то образом, когда поток входит в цикл, только элемент первого индекса сохраняется в базе данных.

1 Ответов

Рейтинг:
12

OriginalGriff

Начните с рассмотрения хранимой процедуры: если цикл обрабатывает правильные элементы, но только первый отражается в БД, то SP является наиболее вероятным виновником.
И мы не можем получить доступ к вашей базе данных, чтобы узнать, что делает SP или как он это делает.