gpt4 book ai didi

.net - 如何使用默认为 DateTimeKind.Utc 的 DateTime 值进行 DataSet.Fill?

转载 作者:行者123 更新时间:2023-12-02 06:03:14 25 4
gpt4 key购买 nike

我有一个应用程序,它可以从 SQL 读取数据并通过 WCF 将其发送到客户端应用程序,其方式与此类似:

SqlDataAdapter da = new SqlDataAdapter( cmd )
DataSet ds = new DataSet();
da.Fill( ds );
return ds;

所有日期/时间均以 UTC 形式存储在数据库中。我注意到,如果运行应用程序的计算机上的时钟出现偏差,则客户端收到的日期/时间也会出现偏差。看来,如果 DateTime 类型是未指定的类型,WCF 会在内部将其表示为本地时间,并按此发送,因此应用程序和客户端之间的任何时间差异都会导致日期/时间发生变化。

我当然可以在检索数据集时对其进行检查并修复日期/时间字段,但是这里有人会想到一些更好的方法来填充数据集,以便每个 DateTime 字段都会自动成为 da.Fill 上的 DateTimeKind.Utc( )?

最佳答案

如果您使用的是 SQL Server 2008,那么“正确”的解决方案是使用 SQL datetimeoffset数据类型而不是 SQL 的日期时间。 datetimeoffset 是 SQL 2008 中新增的时区感知日期/时间类型,将在 ADO.NET 中转换为 CLR System.DateTimeOffset类型始终与 UTC 相关。这是 blog post详细了解这一点。 first few search results on MSDN for DateTimeOffset提供额外的背景信息。

如果您无法更改 SQL 架构,ADO.NET 有一个针对这种情况定制的属性:DataColumn.DateTimeMode ,它控制是否在序列化数据集时添加本地时区(DateTimeMode=DataSetDateTime.UnspecifiedLocal,这是默认值),或者是否在序列化时不添加时区信息(DateTimeMode=DataSetDateTime.Unspecified )。你想要后者。

如果我对 MSDN 文档的阅读是正确的,您应该能够在填充 DataSet 后为相关的 DataColumn 设置 DateTimeMode=DataSetDateTime.Unspecified。这应该序列化没有时区的列。

如果您想要真正正确(或者万一上述方法不起作用),您可以提前创建 DataTable 并设置该列的 DateTimeMode=DataSetDateTime.Utc 在用行填充之前。然后您就可以放心发送 UTC 日期。

关于.net - 如何使用默认为 DateTimeKind.Utc 的 DateTime 值进行 DataSet.Fill?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712039/

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