字符串未被识别为有效的日期时间,源日期为0000-00-00 00:00:000

时间:2018-11-13 08:01:54

标签: c# mysql

更新

显然不是由0000-00-00 00:00:000引起的,当值为2016-04-21 00:00:00.000时程序出错了,知道是什么原因吗?


我有一个VS C#程序,它将从MSSQL中进行选择,然后将INSERT / ON DUPLICATE UPDATE插入MySQL数据库。我有一个日期时间为NULL的特定行,我的MSSQL查询和结果是:

查询

SELECT UserID,LastPasswordDate,
CASE WHEN LastPasswordDate IS NULL THEN '0000-00-00 00:00:00:000' 
    ELSE convert(varchar, LastPasswordDate, 121) END as LastPasswordDate2 from users
    order by LastPasswordDate

结果

enter image description here

C#代码

string LastPasswordDate = row["LastPasswordDate"].ToString(); // Or
//DateTime LastPasswordDate = DateTime.ParseExact(row["LastPasswordDate"].ToString(), "yyyy-MM-dd HH:mm:ss:fff", null);

insertUserCommand.Parameters.AddWithValue("@LastPasswordDate", LastPasswordDate);
insertUserCommand.ExecuteNonQuery();
insertUserCommand.Parameters.Clear();
tran.Commit();

我尝试使用C#转换,但始终收到与提到的标题相同的错误消息

3 个答案:

答案 0 :(得分:0)

问题是,用于检查的字符串'0000-00-00 00:00:00:000'即使可以像在数据库中那样保存,也无法在代码中转换为有效的日期时间。最好的解决方案是在数据库中设置默认值null并寻找该值

答案 1 :(得分:0)

在.Net中,DateTime.MinValue为1/1/0001 12:00:00 AM,因此,Register 00:00:00不在有效的DateTime值范围内。

请参阅DateTime.MinValue

答案 2 :(得分:0)

您应该知道的第一件事是MySQL中的datetime数据类型具有最小值URL,而不是1000-01-01 00:00:00.000的最小值,当使用无效的日期时间转换时,该值用作“零”值显示日期。其次,DateTime.MinValue的最小值为0000-00-00 00:00:00.000,不适合如上所述转换MySQL的“零”值。

如果MySQL DB中的目标列具有可为空的0001-01-01 00:00:00.000数据类型,则当无法解析“零”日期时,应使用TryParseExact()并使用datetime来分配空值:< / p>

DBNull.Value

但是我认为最好从T-SQL查询返回空值并用Convert.IsDBNull()进行检查,然后使用DateTime date; DateTime? LastPasswordDate; if (DateTime.TryParseExact(row["LastPasswordDate"].ToString(), out date)) { LastPasswordDate = date; } else { LastPasswordDate = null; } insertUserCommand.Parameters.AddWithValue("@LastPasswordDate", (object)LastPasswordDate ?? DBNull.Value); insertUserCommand.ExecuteNonQuery(); 将空值分配给数据库列:

DBNull.Value