5

我已经四处搜索,但尚未为我的问题找到令人满意的答案:

概述:我正在开发一个小型应用程序,该应用程序使用 WCF 将多个 DateTime 字段用于单个表。我们正在尝试消除所有表中的空字段。到目前为止,每当我们转换从表中选择的日期时间字段时,我们首先验证它是否为空,然后再显示或以其他方式“使用”它。如果该值为 NULL,我们替换DateTime.MinValue该值。由于我们现在要删除所有字段的可空方面,我们需要插入一个表示空的公共值;由于DateTime.MinValue()在代码中的任何地方都被替换,因此将其作为空替换放入字段中似乎是一个可行的值。

问题:插入 aDateTime.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”年除外,这似乎很好。(考虑到过去的默认年份,如 1970 年 12:00 AM 仍然是相当标准的,但我离题了......)

是的,我知道 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 的引用......我试图避免这种情况,因为它在评估“默认”值时不遵循任何标准的逻辑思想。

建议任何人?

4

1 回答 1

4

这取决于您用于存储数据的数据库。例如,SQL Server 的最小日期为 1753 年 1 月 1 日,请参阅MSDN。我不确定甲骨文。

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

于 2012-11-28T21:30:09.503 回答