我有一个使用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,但似乎没有这样做
答案 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中引入了丑陋。
但是,在这一点上,我认为这可以被认为是个人偏好的问题。