无法从占位符文本框更新数据库表

时间:2018-06-14 15:58:49

标签: c# asp.net asp.net-placeholder placeholder-control

我想使用占位符文本框更新数据库表,但是说它是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 个答案:

答案 0 :(得分:1)

根据我迄今为止所掌握的信息,在这里猜测一下。

你的第一个for循环是设置previousCourse变量,但是在每个循环中写入变量的方式被覆盖,因此不需要for循环。然后在命令中不使用previousCourse变量来运行存储过程,这意味着您没有查询数据库,也没有使用有关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和参数中也将为空或null,因此当您再次更新数据库时,它们仍将为null或空白。您不必弄清楚哪些更改了。只需用你拥有的东西更新它们。如果它们没有改变,那么它们将被更新为与之前相同的值。

设置参数时,请勿使用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++;  
}

令人费解的另一件事是你的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);
}