插入数据后DataGridView无法刷新的技术求助
DataGridView插入数据后无法即时刷新的解决方案
问题核心原因
- SQL字符串拼接导致日期格式不兼容:原代码直接将DateTimePicker的Value转为字符串拼接进SQL,本地日期格式与数据库格式不一致,导致新插入的
DateTime.Now不在查询范围内,切换窗体后格式可能被重新解析才会显示。 - 全局SqlConnection状态异常:复用全局连接可能出现意外的连接状态,导致查询执行失败但被catch块吞掉,无法加载最新数据。
- 输入未做有效处理:
tbPaymentLimit为空时直接返回,导致无数据加载,且未给出提示。
修改后的代码实现
重构loadData方法(解决查询与连接问题)
private void loadData() { // 处理显示条数的输入验证,设置默认值 int limit; if (string.IsNullOrEmpty(tbPaymentLimit.Text)) { limit = 100; // 默认加载100条,可按需调整 tbPaymentLimit.Text = limit.ToString(); } else if (!int.TryParse(tbPaymentLimit.Text, out limit)) { MessageBox.Show("请输入有效的数字作为显示条数"); return; } // 使用using自动管理连接生命周期,避免状态异常 using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["myDB"].ToString())) { try { con.Open(); // 参数化查询,避免SQL注入与日期格式问题 string query = "SELECT TOP (@Limit) * FROM MiscPayments WHERE DateTime BETWEEN @FromDate AND @ToDate;"; SqlCommand cmd = new SqlCommand(query, con); cmd.Parameters.AddWithValue("@Limit", limit); cmd.Parameters.AddWithValue("@FromDate", dtPickerFrom.Value); cmd.Parameters.AddWithValue("@ToDate", dtPickerTo.Value); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); // 先清空数据源再重新绑定,确保UI更新 dgvPayments.DataSource = null; dgvPayments.DataSource = dt; } catch (Exception ex) { MessageBox.Show($"加载数据出错:{ex.Message}"); } } }
修改插入数据方法(优化连接与验证)
private void btnPaymentUpdate_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(tbPPaid.Text) || string.IsNullOrEmpty(tbPDesc.Text)) { MessageBox.Show("请填写完整的付款信息"); return; } double paidAmount; if (!double.TryParse(tbPPaid.Text, out paidAmount)) { MessageBox.Show("请输入有效的金额"); return; } using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["myDB"].ToString())) { try { con.Open(); string query = "INSERT INTO MiscPayments (Description, Paid, DateTime) VALUES (@Description, @Paid, @DateTime)"; SqlCommand cmd = new SqlCommand(query, con); cmd.Parameters.AddWithValue("@Description", tbPDesc.Text); cmd.Parameters.AddWithValue("@Paid", paidAmount); cmd.Parameters.AddWithValue("@DateTime", DateTime.Now); int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected > 0) { MessageBox.Show($"付款 {paidAmount} 已成功添加"); tbPPaid.Text = ""; tbPDesc.Text = ""; loadData(); // 插入成功后立即刷新表格 } else { MessageBox.Show("添加付款失败,请重试"); } } catch (Exception ex) { MessageBox.Show($"添加付款出错:{ex.Message}"); } } }
额外优化点
- 移除全局
SqlConnection,改用局部连接+using语句,自动管理连接的打开与关闭,避免连接泄漏或状态异常。 - 增加输入验证,对金额、显示条数做格式校验,避免无效操作并给出明确提示。
- 参数化查询完全替代字符串拼接,彻底解决SQL注入风险与日期格式兼容问题。
内容的提问来源于stack exchange,提问作者sami
相关产品推荐
相关产品推荐

