更新
显然不是由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
结果
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#转换,但始终收到与提到的标题相同的错误消息
答案 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值范围内。
答案 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