我有一个使用SQL time(7)类型的现有数据库,它不直接映射到.Net类型。
问题:使用Dapper,如何将SQL time列映射到.Net类型?
问题:当我试图使用Dapper隐式将SQL time(7)列映射到DateTime时,会得到以下异常:
“System.Data.DataException”类型的异常发生在Dapper.dll中,但未在用户代码中处理 附加信息:错误解析列5 (CheckInTime=08:54:43.1470000 - Object)
我以为它会自动映射到DateTime,但它似乎没有这样做。
发布于 2013-12-20 12:31:37
我已经成功地将SQL (7)列映射到System.TimeSpan。
正如Dan指出的,如果您的意图是表示一天中的某个时间,那么TimeSpan在“语义上”就不太合适了。
但我认为,从技术上讲,从时间(7)到TimeSpan没有丢失信息,所以数据就在那里,这是一个有意义的问题。
为了减轻这种丑陋,我一直使用的一种方法是使用私有TimeSpan属性来查询和公开自定义类型的公共属性中的数据。
我更喜欢使用DateTime而不是使用SQL中对CONVERT()的调用,因为即使使用了DateTime,您的数据仍然有一个“不完美”的表示(日期部分是假的),和也在SQL中引入了丑陋。
但是,在这一点上,我认为这可以看作是个人偏好的问题。
发布于 2013-12-19 18:09:20
根据您的需要,您必须显式地将time中的time列强制转换为DateTime或TimeSpan。
如果您的时间代表一天中的某个时间(即下午4:15)
string sql = @"SELECT CONVERT(DATETIME, InTime) AS CheckInTime FROM TimeLog";
var checkInTimes = _conn.Query<DateTime>(sql).ToList();如果您的时间表示一天中可空的时间(即下午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();请注意,生成的DateTime对象的日期部分将设置为1900-01-01。
如果您的时间代表一段时间(即2小时47分钟的运行时间)
在这种情况下,最好转换为TimeSpan,它不包括无效的1900年日期,但也不允许在.ToString()中设置AM/PM格式。
string sql = @"SELECT RunningTime FROM TimeLog";
var movieLength = _conn.Query<TimeSpan>(sql).ToList();感谢毛罗指出了这个用例。
https://stackoverflow.com/questions/20688723
复制相似问题