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
相关产品推荐
相关产品推荐

