DropDownList选中项插入SQL数据库异常问题排查
解决Web Forms中DropDownList选中值无法插入SQL表的问题
兄弟,看了你的代码我立刻就发现了核心问题——你在Page_Load里每次页面加载(包括点击提交按钮的回发操作)都会重新绑定DropDownList,这直接导致用户选中的选项在提交时被重置成默认值,自然插不到正确的内容!
核心修复:给DropDownList绑定加回发判断
Web Forms里Page_Load事件会在页面第一次加载和每次回发时都执行,你现在的逻辑是不管什么情况都重新绑定下拉框,用户选的值直接被覆盖了。只需要给绑定代码加上!IsPostBack判断,让下拉框只在第一次加载页面时初始化:
修改后的Page_Load代码:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) // 关键:仅首次加载页面时绑定下拉框 { // 绑定CIT Company下拉框 using (SqlConnection con = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\****;Persist Security Info=True;User ID=***;Password=****;Connect Timeout=30")) { con.Open(); SqlCommand cmd = new SqlCommand("Select CIT_ID, CIT_CompanyName from CIT_Details", con); ddlCITCompany.DataSource = cmd.ExecuteReader(); ddlCITCompany.DataTextField = "CIT_CompanyName"; ddlCITCompany.DataValueField = "CIT_ID"; ddlCITCompany.DataBind(); } // 绑定Site Details下拉框 using (SqlConnection con2 = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\***;Persist Security Info=True;User ID=***;Password=****;Connect Timeout=30")) { con2.Open(); SqlCommand cmd2 = new SqlCommand("Select Site_ID, Site_Name from Site_Details", con2); ddlVisitingCentre.DataSource = cmd2.ExecuteReader(); ddlVisitingCentre.DataTextField = "Site_Name"; ddlVisitingCentre.DataValueField = "Site_ID"; ddlVisitingCentre.DataBind(); } } }
我还给你加了using语句,这样数据库连接会自动释放,避免资源泄漏,这是Web Forms操作数据库的好习惯~
额外排查点(如果修复后仍有问题)
- 字段类型匹配检查:如果
CIT_ID和Site_ID是整数类型,SelectedValue是字符串,AddWithValue会自动转换,但如果报错可以显式指定参数类型:cmd.Parameters.Add("@CIT_Company", SqlDbType.Int).Value = int.Parse(ddlCITCompany.SelectedValue); - 调试确认选中值:在
Submit2_Click开头加一行调试代码,验证实际拿到的选中值:Debug.WriteLine($"选中的CIT Company值:{ddlCITCompany.SelectedValue}"); Debug.WriteLine($"选中的Visiting Centre值:{ddlVisitingCentre.SelectedValue}"); - ViewState检查:确保DropDownList的
EnableViewState属性为true(默认就是true,除非你手动修改过)。
优化后的提交事件代码
我顺便优化了提交逻辑的资源管理,代码更简洁安全:
protected void Submit2_Click(object sender, EventArgs e) { string connectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=C:\\***;Persist Security Info=True;User ID=***;Password=****;Connect Timeout=30"; string insertSql = @"INSERT INTO Booking_Data (Visiting_Centre, Expected_Arrival_Date, Expected_Arrival_Time, Actual_Arrival_Date, Actual_Arrival_Time, CIT_Company, Driver_Name, Vehicle_Registration, Supplied_Password, Delivery_In, Delivery_Out, Time_Booked_In, Time_Booked_Out) VALUES (@Visiting_Centre, @Expected_Arrival_Date, @Expected_Arrival_Time, @Actual_Arrival_Date, @Actual_Arrival_Time, @CIT_Company, @Driver_Name, @Vehicle_Registration, @Supplied_Password, @Delivery_In, @Delivery_Out, @Time_Booked_In, @Time_Booked_Out)"; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); using (SqlCommand cmd = new SqlCommand(insertSql, con)) { cmd.Parameters.AddWithValue("@Visiting_Centre", ddlVisitingCentre.SelectedValue); cmd.Parameters.AddWithValue("@Expected_Arrival_Date", txtExpectedArrivalDate.Text); cmd.Parameters.AddWithValue("@Expected_Arrival_Time", txtExpectedArrivalTime.Text); cmd.Parameters.AddWithValue("@Actual_Arrival_Date", txtActualArrivalDate.Text); cmd.Parameters.AddWithValue("@Actual_Arrival_Time", txtActualArrivalTime.Text); cmd.Parameters.AddWithValue("@CIT_Company", ddlCITCompany.SelectedValue); cmd.Parameters.AddWithValue("@Driver_Name", txtDriverName.Text); cmd.Parameters.AddWithValue("@Vehicle_Registration", txtVehicleRegistration.Text); cmd.Parameters.AddWithValue("@Supplied_Password", txtSuppliedPassword.Text); cmd.Parameters.AddWithValue("@Delivery_In", txtDeliveryIn.Text); cmd.Parameters.AddWithValue("@Delivery_Out", txtDeliveryOut.Text); cmd.Parameters.AddWithValue("@Time_Booked_In", txtTimeBookedIn.Text); cmd.Parameters.AddWithValue("@Time_Booked_Out", txtTimeBookedOut.Text); cmd.ExecuteNonQuery(); } } }
这样修改后,就能正确插入你选中的DropDownList值了!
内容的提问来源于stack exchange,提问作者KLomax
相关产品推荐
相关产品推荐

