【问题标题】:Using Dapper-dot-net, how do I map SQL Time column to a .Net type?使用 Dapper-dot-net,如何将 SQL Time 列映射到 .Net 类型?
【发布时间】:2013-12-27 03:14:55
【问题描述】:

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

【问题讨论】:

    标签: .net tsql dapper


    【解决方案1】:

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

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

    但我认为,从技术上讲,从 time(7) 到 TimeSpan 不会丢失信息,因此数据就在那里,这是一个意义问题。

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

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

    但是,在这一点上,我认为这可以视为个人喜好问题。

    【讨论】:

    • 好点!虽然它可能取决于我没有提到的一个因素:time(7) 是用来表示时间量还是表示一天中的某个时间?如果您正在寻找金额,那么这是正确的方法。
    • 可以将返回的 TimeSpan 解释为从午夜开始的时间量。
    【解决方案2】:

    您似乎必须根据需要将 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 类型更改为可为空(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 分钟的运行时间)

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

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

    感谢 Mauro 指出这个用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多