2016-12-07 135 views
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 

值被正確地存儲到數據庫,但這感覺很髒/哈克。

在代碼使用

值被設定如下:

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

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

    table.Rows.Add(row); 
} 

哪裏source.TimestampLastModificationDateTime類型:

public DateTime TimestampLastModification { get; set; } 

接下來的數據表被保存到存儲這樣:

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

問題

什麼是一個datetime2字段添加到一個DataColumn並保持預期的精度的正確方法?

+1

將數據從DataTable傳輸到數據庫的代碼在哪裏?這就是事情弄糟的地方,'DATETIME'被用作類型而不是'DATETIME2'。 'System.DateTime'本身具有足夠的精度,'DataColumn'只是按原樣存儲值。 –

+0

好的,我會更新。 – Spikee

+0

這仍然缺少將*寫入數據庫的代碼(或將其讀入'EntityDto',取決於您的方案)。 'table'只是一個內存中的表示,不是你的問題。 –

回答

0

我發現了一個解決方案,它是在我自己的一端,而不是第三方的依賴。我固定它的鑄造日期的查詢中爲nvarchar:

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

接下來,我通過串碼轉換爲datetime:

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

很奇怪的是鑄造一個對象,實際上是一個類型的DateTime,DateTime導致精度損失,但上述確實有效。

+1

您在這裏做的是將T-SQL類型DATETIME2轉換爲字符串,然後將其轉換爲.NET System.DateTime。這工作。沒有用的是將DATETIME2作爲DATETIME類型(這是你的提供者正在做的)讀取T-SQL類型'DATETIME2'。 'DATETIME'!='System.DateTime'。精確度損失是由DATETIME T-SQL類型引起的,而不是因爲您在投射對象。另一方面,'DATETIME2'是專爲與System.DateTime對齊而創建的(但由於它不是標準類型,因此需要支持)。 –