Невозможно обновить таблицу базы данных из текстовых полей заполнителя

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

Хранимая процедура

    update Student set Course1= @Course1, Course2= @Course2,Course3= @Course3,
lastUser=@user, lastUpdate=@lastupdate, previous_Course1=@previous_Course1,previous_Course2=@previous_Course2,previous_Course3=@previous_Course3 where userNum=@userNum

Код позади

protected void btnUpdate_Click(object sender, EventArgs e)
    {


      string previousCourse = null;
     foreach (TextBox textBox in ContentPlaceHolder1.Controls.OfType<TextBox>())
                            {
                                SqlCommand com2 = new SqlCommand("select course1,course2,course3 from Course where loadsheetnum= '" + txtuserNum.Text + "'", connection);

                                SqlDataReader myReader = null;
                                myReader = com2.ExecuteReader();

                                while (myReader.Read())
                                {


                                    previousCourse = Convert.ToString(myReader["Course1"]);

                                }
                                myReader.Close();
                            }

                                int maxPossibleTextBoxCount = 3;
                                int selectedTextBoxCount = ContentPlaceHolder1.Controls.OfType<TextBox>().Count();
                                int emptyTextBoxCount = maxPossibleTextBoxCount - selectedTextBoxCount;

                                using (var cmd = new SqlCommand("PP_updateStudent", connection))
                                {
                                    cmd.Parameters.AddWithValue("@userNum", txtuserNum.Text);
                                    cmd.Parameters.Add("@lastupdate", SqlDbType.DateTime).Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");

                                    int counter = 1;


                                    foreach (TextBox textBox in ContentPlaceHolder1.Controls.OfType<TextBox>())
                                    {
                                            cmd.Parameters.AddWithValue($"@previous_Course{counter++}", previousCourse );
                                            cmd.Parameters.AddWithValue($"@Course{counter++}", textBox.Text);
                                        }


                                    if (emptyTextBoxCount > 0)
                                    {
                                        for (int i = 0; i < emptyTextBoxCount - 1; i++)
                                        {
                                             cmd.Parameters.AddWithValue($"@Course{counter++}", System.DBNull.Value);
    cmd.Parameters.AddWithValue($"@previous_Course{counter++}", System.DBNull.Value);
                                        }
                                    }

                                    cmd.ExecuteNonQuery();
                                    cmd.Parameters.Clear();
                                }

                            }

    }

1 ответ

Решение

Просто сделайте предположение здесь, основываясь на том, что я понимаю из информации до сих пор.

Ваш первый цикл for устанавливает переменную previousCourse, но способ ее записи перезаписывается в каждом цикле, поэтому цикл for не нужен. Тогда переменная previousCourse не используется в команде для запуска хранимой процедуры, что означает, что вы запросили базу данных даром и не используете информацию о предыдущем курсе. Когда вы добавляете параметр @previousCourse, вы даете ему значение из текстового поля, а не значение из базы данных.

Если вы хотите сохранить 3 предыдущих курса, по одному для каждого текстового поля, вам понадобятся 3 переменные: previousCourse1, previousCourse2 и previousCourse3. Вызовите dataReader один раз и прочитайте каждое поле из него в свои переменные.

previousCourse1 = Convert.ToString(myReader["Course1"]);
previousCourse2 = Convert.ToString(myReader["Course2"]);
previousCourse3 = Convert.ToString(myReader["Course3"]);

Если у какого-либо пользователя менее 3 курсов, эти поля в базе данных будут пустыми или пустыми. Они также будут пустыми или нулевыми в dataReader и параметрах, поэтому при повторном обновлении базы данных они по-прежнему будут нулевыми или пустыми. Вам не нужно выяснять, какие из них изменились. Просто обновите их все, что у вас есть. Если они не изменились, они будут обновлены до того же значения, что и раньше.

При настройке параметров не беспокойтесь о цикле for или счетчике. Просто установите их все каждый раз. Я не вижу, как вы назвали свои текстовые поля, но я предполагаю, что это txtCourse1, txtCourse2, txtCourse3. Если существующее значение в текстовом поле совпадает с соответствующим предыдущим курсом, вам не нужно добавлять параметр.

if (txtCourse1.Text != previousCourse1) {
   cmd.Parameters.AddWithValue($"@previous_Course1, previousCourse1); 
   cmd.Parameters.AddWithValue($"@Course1", txtCourse1.Text); 
   counter++;  
}
if (txtCourse2.Text != previousCourse2) {
   cmd.Parameters.AddWithValue($"@previous_Course2, previousCourse2); 
   cmd.Parameters.AddWithValue($"@Course2", txtCourse2.Text); 
   counter++;  
}
if (txtCourse3.Text != previousCourse3) {
   cmd.Parameters.AddWithValue($"@previous_Course3, previousCourse3); 
   cmd.Parameters.AddWithValue($"@Course3", txtCourse3.Text); 
   counter++;  
}

Еще одна вещь, которая вызывает недоумение, это то, что selectedTextBoxCount включает в себя все текстовые поля в контейнере, поэтому, если у вас есть 3 текстовых поля в контейнере, то emptyTextBoxCount всегда будет 0. Я думаю, что приведенные выше предложения будут иметь дело с пустыми текстовыми полями без вашего сделать это отдельно.

Или, может быть, вы можете сделать это:

if (txtCourse1.Text != previousCourse1 && txtCourse1.Text != String.Empty) {
   cmd.Parameters.AddWithValue($"@previous_Course1, previousCourse1); 
   cmd.Parameters.AddWithValue($"@Course1", txtCourse1.Text); 
} else if (txtCourse1.Text == String.Empty){
   cmd.Parameters.AddWithValue($"@previous_Course1, System.DBNull.Value); 
   cmd.Parameters.AddWithValue($"@Course1", System.DBNull.Value);
}
if (txtCourse2.Text != previousCourse2 && txtCourse2.Text != String.Empty) {
   cmd.Parameters.AddWithValue($"@previous_Course2, previousCourse2); 
   cmd.Parameters.AddWithValue($"@Course2", txtCourse2.Text); 
} else if (txtCourse2.Text == String.Empty){
   cmd.Parameters.AddWithValue($"@previous_Course2, System.DBNull.Value); 
   cmd.Parameters.AddWithValue($"@Course2", System.DBNull.Value);
}
if (txtCourse3.Text != previousCourse3 && txtCourse3.Text != String.Empty) {
   cmd.Parameters.AddWithValue($"@previous_Course3, previousCourse3); 
   cmd.Parameters.AddWithValue($"@Course3", txtCourse3.Text); 
} else if (txtCourse3.Text == String.Empty){
   cmd.Parameters.AddWithValue($"@previous_Course3, System.DBNull.Value); 
   cmd.Parameters.AddWithValue($"@Course3", System.DBNull.Value);
}
Другие вопросы по тегам