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

时间:2013-12-19 18:09:20

标签: .net tsql dapper

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

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

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

  

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

     

其他信息:解析第5列时出错   (CheckInTime = 08:54:43.1470000 - 对象)

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

2 个答案:

答案 0 :(得分:1)

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

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

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

var checkInTimes = _conn.Query<DateTime>(sql).ToList();

如果您的时间代表可以逗留的时间(即下午4:15或无效)

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

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

var checkOutTimes = _conn.Query<DateTime?>(sql).ToList();

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

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

在这种情况下,最好转换为TimeSpan,它不包含无效的1900日期,但也不允许在.ToString()

中进行AM / PM格式化
string sql = @"SELECT RunningTime FROM TimeLog";
var movieLength = _conn.Query<TimeSpan>(sql).ToList();

感谢Mauro指出这个用例。

答案 1 :(得分:1)

我已成功将SQL time(7)列映射到System.TimeSpan

正如丹所指出的那样,如果你的意图是代表一天的时间,那么TimeSpan在语义上是不合适的。

但我认为,从技术上讲,从时间(7)到TimeSpan没有信息丢失,所以数据就在那里,这是一个意义问题。

我一直用来缓解丑陋的一种方法是使用私有TimeSpan属性,只是为了查询和公开自定义类型的公共属性中的数据。

我更喜欢将DateTime与SQL中CONVERT()的调用结合使用,因为即使使用DateTime,您仍然会以某种方式“不完美”地表示数据(日期部分是假的)你也在SQL中引入了丑陋。

但是,在这一点上,我认为这可以被认为是个人偏好的问题。