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

导入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:55:15