gpt4 book ai didi

C#、WCF 和 DateTime.MinValue() 与空日期

转载 作者:太空狗 更新时间:2023-10-29 23:24:36 25 4
gpt4 key购买 nike

我四处搜索,但还没有为我的问题找到令人满意的答案:

概述:我正在开发一个小型应用程序,该应用程序使用 WCF 将多个 DateTime 字段用于一个表中。我们正在尝试消除所有表中的空字段。到目前为止,每当我们转换从表中选择的日期时间字段时,我们首先会在显示或“使用”它之前验证它是否为空。如果该值为 NULL,我们将用 DateTime.MinValue 替换该值。由于我们现在要删除所有字段的可空方面,因此我们需要插入一个表示空的公共(public)值;由于 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:00 或年份“1”,这似乎还不错。 (考虑到像 12:00 AM 1970 这样的默认年份的过去仍然相当标准,但我离题了......)

是的,我知道 DateTime 不是 C#,它是 .NET。我还知道 WCF 在其转换约束中允许使用某种形式的“最小”和“最大”时间。我不知道如何设置它们(我也不知道如何设置 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 的引用...我正在努力避免这种情况,因为它在评估“默认”值时不遵循任何标准的逻辑思想.

有什么建议吗?

最佳答案

这取决于您用来存储数据的数据库。例如,SQL Server 的最小日期为 1/1/1753,请参阅 MSDN .我不确定 Oracle。

如果你必须使用一个神奇的日期,你可以使用那个,或者其他特定的日期(我使用 1815 年 12 月 10 日是为了纪念第一位程序员 Ada Lovelace 女士)。一般来说,如果您遇到没有已知值的情况,数据存储应该将该值表示为“null”。现在在实践中,这并不总是可行的。您可以做的是将可为 null 的列重构到一个子表中,并且仅在您确实有要记录的内容时才包含子记录。

关于C#、WCF 和 DateTime.MinValue() 与空日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com