2

背景

字段 TimestampCreation 在 DB 中是这样创建的:

[TimestampCreation] [datetime2](7) NOT NULL

如果我将字段添加到这样的数据表中:

table.Columns.Add(new DataColumn("TimestampCreation", typeof(DateTime)));

该值会丢失精度,因为它的存储方式如下:

2016-12-07 11:38:39.4990000

什么时候应该

2016-12-07 11:38:39.4998426

我尝试过的一种解决方案

如果我像这样添加列:

table.Columns.Add(new DataColumn("TimestampCreation", typeof(string))); // Actually datetime2

该值已正确存储到 DB,但这感觉很脏/hacky。

代码中的用法

该值设置如下:

public static void AddToTable(this EntityDto source, DataTable table)
{
    var row = table.NewRow();

    ...
    ...
    row["TimestampLastModification"] = source.TimestampLastModification;

    table.Rows.Add(row);
}

哪里source.TimestampLastModification是类型DateTime

public DateTime TimestampLastModification { get; set; }

接下来将数据表保存到存储中,如下所示:

Root.PluginManager().PersistentStorage(ParametersHelper.OverallSchema).Insert(ref table)

问题

datetime2将字段添加到数据列并保持预期精度的正确方法是什么?

4

1 回答 1

0

我找到了一个解决方案,这是我自己的事情,而不是第三方依赖。我通过在查询中将日期转换为 nvarchar 来修复它:

SELECT CONVERT(VARCHAR, [TimestampLastModification], 126) [TimestampLastModification]
FROM ...

接下来我通过代码将字符串转换为日期时间:

this.TimestampLastModification = Convert.ToDateTime(source["TimestampLastModification"].ToString()),

奇怪的是,将一个实际上是 DateTime 类型的对象转换为 DateTime 会导致精度损失,但上述方法确实有效。

于 2016-12-08T07:29:23.580 回答