使用Dapper-dot-net,如何将SQL Time列映射到.Net类型?

Dan*_*sen 7 .net t-sql dapper

我有一个使用SQL time(7)类型的现有数据库,该数据库不直接映射到.Net类型。

问题:使用Dapper,如何将SQL time列映射到.Net类型?

问题:当我尝试将SQL time(7)列隐式映射到DateTime使用Dapper-dot-net时,出现以下异常:

Dapper.dll中发生类型为'System.Data.DataException'的异常,但未在用户代码中处理

附加信息:错误分析列5(CheckInTime = 08:54:43.1470000-对象)

我以为它会自动映射到DateTime,但似乎没有这样做

Dan*_*sen 1

看来您必须根据您的需要将 T-SQL 中的时间列显式转换/转换为 DateTime 或 TimeSpan。

如果您的时间代表一天中的某个时间(即下午 4:15)

string sql = @"SELECT CONVERT(DATETIME, InTime) AS CheckInTime FROM TimeLog";

var checkInTimes = _conn.Query<DateTime>(sql).ToList();
Run Code Online (Sandbox Code Playgroud)

如果您的时间代表一天中可为空的时间(即下午 4:15 或为空)

要处理可为空的时间,只需将目标 .Net 类型更改为可为空(DateTime?):

// Note: the OutTime column is nullable
string sql = @"SELECT CONVERT(DATETIME, OutTime) AS CheckOutTime FROM TimeLog";

var checkOutTimes = _conn.Query<DateTime?>(sql).ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,生成的 DateTime 对象的日期部分将设置为 1900-01-01。

如果您的时间代表一段时间(即 2 小时 47 分钟的运行时间)

在这种情况下,最好转换为 TimeSpan,它不会包含无效的 1900 日期,但也不允许在 .ToString() 中使用 AM/PM 格式

string sql = @"SELECT RunningTime FROM TimeLog";
var movieLength = _conn.Query<TimeSpan>(sql).ToList();
Run Code Online (Sandbox Code Playgroud)

感谢 Mauro 指出这个用例。