首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用,如何将SQL时间列映射到.Net类型?

使用,如何将SQL时间列映射到.Net类型?
EN

Stack Overflow用户
提问于 2013-12-19 18:09:20
回答 2查看 7.3K关注 0票数 13

我有一个使用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,但它似乎没有这样做。

EN

回答 2

Stack Overflow用户

发布于 2013-12-20 12:31:37

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

正如Dan指出的,如果您的意图是表示一天中的某个时间,那么TimeSpan在“语义上”就不太合适了。

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

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

我更喜欢使用DateTime而不是使用SQL中对CONVERT()的调用,因为即使使用了DateTime,您的数据仍然有一个“不完美”的表示(日期部分是假的),也在SQL中引入了丑陋。

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-19 18:09:20

根据您的需要,您必须显式地将time中的time列强制转换为DateTime或TimeSpan。

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

代码语言:javascript
复制
string sql = @"SELECT CONVERT(DATETIME, InTime) AS CheckInTime FROM TimeLog";

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

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

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

代码语言:javascript
复制
// 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格式。

代码语言:javascript
复制
string sql = @"SELECT RunningTime FROM TimeLog";
var movieLength = _conn.Query<TimeSpan>(sql).ToList();

感谢毛罗指出了这个用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20688723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档