【发布时间】:2016-12-07 10:43:54
【问题描述】:
背景
字段 TimestampCreation 是在数据库中这样创建的:
[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 字段添加到数据列并保持预期精度的正确方法是什么?
【问题讨论】:
-
将数据从
DataTable传输到数据库的代码在哪里?这就是事情变得一团糟的地方,DATETIME被用作类型而不是DATETIME2。System.DateTime本身具有足够的精度,DataColumn只是按原样存储值。 -
好的,我会更新的。
-
这仍然缺少 写入 到数据库(或将其读入
EntityDto,具体取决于您的方案)的代码。table只是内存中的表示,不是你的问题。 -
@JeroenMostert:这是一个写,我也添加了插入代码。它是适用于数据集/数据表的旧提供程序。
-
你有它。无论
Root.PluginManager().PersistentStorage().Insert()的实现是什么,决定所有DateTime列都应该作为DATETIME而不是DATETIME2传输。如果你不能影响它,那你就不走运了。DataColumn无法明确地传达特定于提供程序的类型,例如DATETIME2(即使这样做,您的提供程序也可能不支持)。您可以尝试传入DateTimeOffset,但我怀疑它对此是否有支持。如果您必须传递一个字符串,请确保它是 ISO (.ToString("yyyyMMdd HH:mm:ss.fffffff"))。
标签: .net sql-server precision datetime2