代码之家  ›  专栏  ›  技术社区  ›  galets

如何设置数据集。用默认为datetimekind.utc的datetime值填充?

  •  6
  • galets  · 技术社区  · 15 年前

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

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

    所有日期/时间都以UTC的形式存储在数据库中。我注意到,如果运行应用程序的计算机上的时钟出现偏差,客户机接收到的日期/时间也会出现偏差。似乎在日期时间类型未指定的情况下,WCF将在内部将其表示为本地时间,并以此方式发送,因此应用程序和客户端之间的任何时间差都将导致日期/时间移动。

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

    2 回复  |  直到 5 年前
        1
  •  16
  •   Justin Grant    15 年前

    如果您使用的是SQL Server 2008,那么“正确的”解决方案是使用SQL datetimeoffset 数据类型而不是SQL的日期时间。 数据偏移 是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文档的阅读是正确的,您应该能够设置 日期时间模式=datasetdatetime.unspecified 对于 DataColumn 在数据集填充后出现问题。这应该序列化没有时区的列。

    如果您想要真正正确(或者在上述方法不起作用的情况下),您可以创建 DataTable 提前把那个专栏的 DateTimeMode=DataSetDateTime.Utc 之前 Fill -排成一排。那么您就可以放心将日期发送为UTC。

        2
  •  0
  •   Bill    5 年前

    在我的例子中,将相关列的datetimemode属性值更改为“unspecialed”,而不是将XSD模式中的默认值“unspecialedlocal”。

    推荐文章