导入CSV文件DateTime值至SQL Server时出现类型转换异常
问题排查:CSV导入SQL时的System.InvalidCastException错误
错误信息
System.InvalidCastException: '指定的转换无效。'
错误触发代码行
cmd.Parameters.AddWithValue("@DateTime", (DateTime)importRow["DateTime"]);
完整代码
using (SqlConnection conn =New SqlConnection(@"Data Source=BL03\SQLEXPRESS; Initial Catalog=HDB; User Id=sa; Password=00")) { conn.Open(); foreach (DataRow importRow in S2P5.Rows) { SqlCommand cmd = new SqlCommand ("INSERT INTO S2P5 (DateTime, Miliseconds, MachineAutoStartStop, Pressure)" + "VALUES (@DateTime, @Miliseconds, @MachineAutoStartStop, @Pressure)", conn); cmd.Parameters.AddWithValue("@DateTime", (DateTime)importRow["DateTime"]); cmd.Parameters.AddWithValue("@Miliseconds", importRow["Miliseconds"]); cmd.Parameters.AddWithValue("@MachineAutoStartStop", importRow["MachineAutoStartStop"]); cmd.Parameters.AddWithValue("@Pressure", importRow["Pressure"]); cmd.ExecuteNonQuery(); } }
问题场景
将CSV文件中的DateTime值导入Microsoft SQL Server数据库时触发上述异常,需排查解决。
排查与解决方案
核心原因
直接强制转换(DateTime)importRow["DateTime"]失败,说明CSV读取后的importRow["DateTime"]不是有效的DateTime类型——可能是CSV日期字符串格式与系统默认解析规则不匹配、字段为空,或是读取CSV时将日期列识别成了字符串类型。
方案1:指定格式安全解析
用DateTime.TryParseExact显式匹配CSV的日期格式,避免格式兼容问题:
string dateStr = importRow["DateTime"]?.ToString().Trim(); // 替换为你CSV实际的日期格式,比如"MM/dd/yyyy HH:mm:ss"或"yyyy-MM-dd" if (DateTime.TryParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTime)) { cmd.Parameters.AddWithValue("@DateTime", dateTime); } else { // 处理解析失败的情况:记录错误日志、跳过该行或设默认值 Console.WriteLine($"无效日期值:{dateStr}"); continue; }
方案2:检查CSV读取配置
如果使用DataTable或第三方库读取CSV,确保读取时将DateTime列设为正确类型:
- 若用
TextFieldParser,读取后手动转换列类型; - 若用CsvHelper,通过映射类显式指定字段的
TypeConverter为DateTimeConverter。
方案3:处理空值与无效数据
若CSV存在空日期字段,先判断是否为DBNull再处理:
if (importRow["DateTime"] != DBNull.Value) { DateTime dateTime; if (DateTime.TryParse(importRow["DateTime"].ToString(), out dateTime)) { cmd.Parameters.AddWithValue("@DateTime", dateTime); } else { // 无效值处理逻辑 } } else { // 空值处理:设为数据库允许的默认值或DBNull.Value cmd.Parameters.AddWithValue("@DateTime", DBNull.Value); }
内容的提问来源于stack exchange,提问作者dhivyah jaiya
相关产品推荐
相关产品推荐

