簡體   English   中英

C#SQL Server:DATETIME數據類型

[英]c# SQL Server : DATETIME datatype

我正在編寫一個單元測試,它將帶有DateTime參數的對象存儲到DATETIME2 SQL Server數據庫列中。 然后,我創建一個名為new_date_time的臨時DateTime對象,並將該值設置為DateTime.Now

然后,將new_date_time值用於更新先前的值,並且執行此操作的SQL查詢成功完成。

當從數據庫重新讀取對象時,我收到了正確的datetime值(天/小時/分鍾),但是.Ticks值不同於new_date_time變量.Ticks屬性。 從read調用返回的值將.Ticks屬性的最后4位數字返回為零。

為什么發生這種舍Assert.AreEqual使我的Assert.AreEqual失敗? :)

謝謝

我猜您在將日期寫入Sql Server時正在使用Parameters.AddWithValue MSDN推斷的CLR DateTime類型是SqlDbType.DateTime不是 SqlDbType.DateTime2因此在將日期寫入數據庫時​​,精度會丟失。

將類型明確設置為datetime2將解決此問題。 例如:

command.Parameters.AddWithValue("@now", DateTime.Now).SqlDbType = 
                                                       SqlDbType.DateTime2;

編輯

@marc_s在他的評論中提出了一個很好的觀點:

您應該閱讀(並擁抱!) 我們可以停止使用AddWithValue()了嗎?

為避免這些問題對您造成困擾,您可以養成在參數集合上使用Add方法的習慣,該方法在某些重載AddWithValue SqlDbType進入,然后在其上設置Value屬性,而不是使用AddWithValue方法:

command.Parameters.Add("@now", SqlDbType.DateTime2).Value = DateTime.Now;

也許您的數據庫字段沒有存儲整個DateTime.Now值,因為它不夠精確。 格式化日期后,為什么不簡單比較一下日期呢?

例如:(未試用):

var databaseDate = d1.ToString("MM/dd/yyyy HH:mm:ss.fff");

var tempDate = d2.ToString("MM/dd/yyyy HH:mm:ss.fff");

Assert.AreEqual(databaseDate, tempDate);

我測試了:使用Linq To Entities我的DateTime.Now正確保存到我的datetime2(7)並且相等測試返回True

您確定要將正確的 datetime值傳遞給數據庫嗎? 沒有截斷嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM