我已经四处寻找但尚未找到令人满意的答案:
概述:我正在开发一个小应用程序,它使用WCF将多个DateTime字段用于单个表。我们正试图消除所有表中的空字段。到目前为止,每当我们转换从表中选择的日期时间字段时,我们首先在显示或“使用”它之前验证它是否为空。如果值为NULL,我们将DateTime.MinValue
替换为值。由于我们现在正在删除所有字段的可空方面,我们需要插入一个表示null的公共值;由于DateTime.MinValue()
在代码中的任何地方被替换,因此作为空替换放入字段似乎是一个可行的值。
问题:插入DateTime.MinValue()
会导致通用“执行此请求时出现问题”错误。
解决方案? :正如其他地方所记载的那样,DateTime.MinValue()
有一个未指定的DateTimeKind所以...我们添加ToUniversalTime调用,如:
DateTime nullDate = DateTime.MinValue.ToUniversalTime(); // 1/1/0001 6:00:00 AM
这不起作用,可能是因为在WCF上的日期转换中有一些“可接受的范围”设置?
评论中注明的是“1/1/0001 6:00 am”的结果值。奇怪的是早上6点或一年“1”,这似乎很好。 (考虑到过去的默认年份,比如1970年代上午12:00仍然是相当标准的,但我离题了......)
是的,我知道DateTime不是C#,它是.NET。我也知道WCF在其转换限制内允许某种形式的“min”和“max”次。我不知道如何设置它们(我也不知道如何设置VerboseMessages位;我对WCF来说还不够新。)
手动创建一个可以很好地转换为表的新字段值的建议是可行的,并且可行:
DateTime nullDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
(顺便说一句,如果我们使用第1年而不是1970年(例如),插入也将失败。)
即使我们使用上面的nullDate作为可行的替代品......问题是代码中的任何地方我们仍在评估代表空日期的DateTime.MinValue()
,而这两个日期并不完全同样的。
我能想到的唯一可行解决方案是覆盖或以其他方式从DateTime创建扩展类以创建公共NullDate并相应地修改所有代码。
有没有人看到一个好的选择?有没有人知道将System.DateTime.MinValue()
插入WCF表的解决方案,例如改变好/坏日期的可接受边界?
我觉得我必须咬紧牙关并更改对MinValue的所有引用...我试图避免这种情况,因为它在评估“默认”值时没有遵循任何标准的逻辑思想
建议任何人?
答案 0 :(得分:4)
这取决于您用于存储数据的数据库。例如,SQL Server的最小日期为1/1/1753,请参阅MSDN。我不确定Oracle。
如果你必须使用魔法日期,你可以使用它或其他特定的东西(我使用1815年12月10日,以纪念第一个程序员Lady Ada Lovelace)。一般来说,如果您遇到没有已知值的情况,则数据存储应将值表示为“null”。现在在实践中,这并不总是可行的。您可以做的是将可空列重构为子表,并且当您实际上有要记录的内容时,只包括子记录。