使用 AddTypeMap 調整型別映射,讓 Dapper 乖乖寫入 0001-01-01 到 datetime2
這週忙著打黑悟空,簡單記一下前陣子同事遇到的一個場景:
由於曆法的關係,SQL Server 的 datetime 範圍只能從 1753-01-01 開始。
如果我們要寫入 0001-01-01 進去的話就會報錯
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
補充:關於曆法的部份,有興趣的朋友可以參考這篇:
淺談:消失的日期,以關聯式資料庫的日期資料類型為例 - 德瑞克:SQL Server 學習筆記
這時候通常去把資料表欄位改成香香的 datetime2 就可以搞定,爽爽寫入 0001-01-01。
但如果我們正在使用 Dapper,預設會把 C# 的 DateTime 映射到 SQL Server 的 datetime,所以還是會寫入失敗。
這時候我們就需要明確地請 Dapper 幫我們使用 datetime2 來進行處理。
如果傳遞的只是某個參數,使用 DbType
就行了:
var parameters = new DynamicParameters();
parameters.Add("@Birthday", birthday, DbType.DateTime2);
但如果傳遞的是某個 Model 裡的特定欄位呢?例如:
public class HistoricalEvent
{
public Guid EventId { get; set; } // 歷史事件的唯一識別碼
public string Description { get; set; } // 歷史事件的描述
public DateTime EventDate { get; set; } // 歷史事件發生的日期, 可能早於 1753 年!
}
這種時候就可以使用 AddTypeMap 來調整一下 Dapper 的映射型別。
……