You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

插入数据后DataGridView无法刷新的技术求助

DataGridView插入数据后无法即时刷新的解决方案

问题核心原因

  1. SQL字符串拼接导致日期格式不兼容:原代码直接将DateTimePicker的Value转为字符串拼接进SQL,本地日期格式与数据库格式不一致,导致新插入的DateTime.Now不在查询范围内,切换窗体后格式可能被重新解析才会显示。
  2. 全局SqlConnection状态异常:复用全局连接可能出现意外的连接状态,导致查询执行失败但被catch块吞掉,无法加载最新数据。
  3. 输入未做有效处理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:42:52