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

C#批量插入DataGridView数据到数据库时ToString方法重载报错

报错原因

  • DataGridViewCell.Value的返回值是object类型,object类自带的ToString()方法没有任何重载支持传入参数,只有DateTime等特定类型才支持带格式字符串的ToString调用。
  • 你直接对object类型的值调用带参数的ToString("hh:mm"),自然触发方法重载不匹配的报错。

解决方法

先把单元格值安全转换为DateTime类型后,再调用带格式的ToString方法,同时增加空值判断避免空引用异常,修改后的代码如下:

// 建议把连接打开操作放到循环外,避免频繁开闭连接损耗性能
con.Open();
for (int i = 0; i < TimesDgv.Rows.Count - 1; i++)
{
    OleDbCommand cmd = new OleDbCommand("Insert into TimesTBL(PeriodName,TimeFrom,TimeTo,Duration) values (@PeriodName,@TimeFrom,@TimeTo,@Duration)", con);
    cmd.Parameters.AddWithValue("PeriodName", TimesDgv.Rows[i].Cells[0].Value ?? DBNull.Value);
    
    // 处理TimeFrom字段
    if (TimesDgv.Rows[i].Cells[1].Value != null && DateTime.TryParse(TimesDgv.Rows[i].Cells[1].Value.ToString(), out DateTime timeFrom))
    {
        cmd.Parameters.AddWithValue("TimeFrom", timeFrom.ToString("hh:mm"));
    }
    else
    {
        cmd.Parameters.AddWithValue("TimeFrom", DBNull.Value);
    }
    
    // 处理TimeTo字段
    if (TimesDgv.Rows[i].Cells[2].Value != null && DateTime.TryParse(TimesDgv.Rows[i].Cells[2].Value.ToString(), out DateTime timeTo))
    {
        cmd.Parameters.AddWithValue("TimeTo", timeTo.ToString("hh:mm"));
    }
    else
    {
        cmd.Parameters.AddWithValue("TimeTo", DBNull.Value);
    }
    
    cmd.Parameters.AddWithValue("Duration", TimesDgv.Rows[i].Cells[3].Value ?? DBNull.Value);
    cmd.ExecuteNonQuery();
}
con.Close();

额外优化说明

  • 避免在循环内反复开闭数据库连接,统一在循环前打开、循环结束后关闭,大幅提升执行效率
  • 增加了空值判断和类型转换校验,避免单元格为空或者值不是合法时间格式时触发运行时异常
  • 对可能为空的字段使用?? DBNull.Value处理,避免null值插入数据库时报错

内容的提问来源于stack exchange,提问作者Bashar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:02