我想使用占位符文本框更新数据库表,但说它是 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();
}
}
}
根据我从目前的信息中了解到的情况,在这里做一个猜测。
您的第一个 for 循环是设置 previousCourse 变量,但它的写入方式在每个循环中都会被覆盖,因此不需要 for 循环。然后,命令中不使用 previousCourse 变量来运行存储过程,这意味着您没有对数据库进行任何查询,并且没有使用有关 previousCourse 的信息。添加 @previousCourse 参数时,将为其提供文本框中的值,而不是数据库中的值。
如果要存储 3 个以前的课程,每个文本框一个,则需要 3 个变量:上一个课程 1、上一个课程 2 和上一个课程 3。调用 dataReader 一次,然后将每个字段从中读取到变量中。
previousCourse1 = Convert.ToString(myReader["Course1"]);
previousCourse2 = Convert.ToString(myReader["Course2"]);
previousCourse3 = Convert.ToString(myReader["Course3"]);
如果任何用户的课程少于 3 门,则数据库中的这些字段将为空或空。它们在 dataReader 和参数中也将为空或空,因此当您再次更新数据库时,它们仍将为空或空白。您不必弄清楚哪些发生了变化。只需使用您拥有的内容更新它们即可。如果它们没有更改,那么它们将被更新为与之前相同的值。
设置参数时,不要打扰 for 循环或计数器。只需每次都设置它们即可。我看不出你是如何命名文本框的,但我假设它们是txtCourse1,txtCourse2,txtCourse3。如果文本框中的现有值与相应的 previousCourse 相同,则无需添加参数。
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++;
}
另一件令人费解的事情是您选择的文本框计数包括容器中的所有文本框,因此,如果容器中有 3 个文本框,则空文本框计数将始终为 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);
}