从字符转换日期和/或时间失败,求Excel转数据库字段的替代方法
解决“从字符转换日期和/或时间时失败”的SQL插入问题
你遇到的问题根源在于直接拼接SQL字符串:当你把DateTime/TimeSpan转成字符串再拼进SQL时,日期时间的格式可能和数据库(看起来是SQL Server)期望的格式不匹配,而且这种写法还存在严重的SQL注入风险。
最可靠的解决方式是使用参数化查询,让数据库直接处理强类型数据,完全避免字符串转换的问题。下面是具体的实现示例(假设你用的是SQL Server和System.Data.SqlClient):
// 假设你已经初始化了有效的SqlConnection对象conn string query = @"INSERT INTO Réception_camions( [Date d'arrivée], [heure d'arrivée], Poids_cam, Id_cam, Id_qualité ) VALUES( @DateArrivee, @HeureArrivee, @PoidsCam, @IdCam, @IdQualite )"; using (SqlCommand cmd = new SqlCommand(query, conn)) { // 先验证并转换Excel中的值(避免Parse失败抛出异常) if (!DateTime.TryParse(ds.Tables[0].Rows[i][0].ToString(), out DateTime dateArrivee)) { // 这里可以添加错误处理逻辑,比如记录日志、跳过当前行 Console.WriteLine($"第{i}行的日期格式无效"); continue; } if (!TimeSpan.TryParse(ds.Tables[0].Rows[i][1].ToString(), out TimeSpan heureArrivee)) { Console.WriteLine($"第{i}行的时间格式无效"); continue; } // 添加参数,直接传入强类型值,无需手动转字符串 cmd.Parameters.AddWithValue("@DateArrivee", dateArrivee); cmd.Parameters.AddWithValue("@HeureArrivee", heureArrivee); cmd.Parameters.AddWithValue("@PoidsCam", ds.Tables[0].Rows[i][2]); cmd.Parameters.AddWithValue("@IdCam", ds.Tables[0].Rows[i][3]); cmd.Parameters.AddWithValue("@IdQualite", ds.Tables[0].Rows[i][4]); // 执行插入操作 cmd.ExecuteNonQuery(); }
为什么这种方式更好?
- 避免类型转换错误:参数化查询会让数据库直接识别DateTime/TimeSpan类型,不需要依赖字符串格式的兼容性,彻底解决“从字符转换日期和/或时间时失败”的问题。
- 防止SQL注入:直接拼接字符串是SQL注入的重灾区,参数化查询能完全规避这个风险,让你的代码更安全。
- 更易维护:参数名清晰对应字段,后期修改字段或逻辑时更直观。
如果你的数据库不是SQL Server,只需要把SqlCommand换成对应数据库的命令类(比如MySqlCommand、OracleCommand),参数化的逻辑是通用的。
内容的提问来源于stack exchange,提问作者M.LOOK
相关产品推荐
相关产品推荐

