Невозможно обновить таблицу базы данных из текстовых полей заполнителя
Я хотел бы обновить таблицу базы данных с использованием текстовых полей-заполнителей, но скажу, что это 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);
}