【问题标题】:How to Convert Datareader Result of DbType.Time to Timespan Object?如何将 DbType.Time 的 Datareader 结果转换为 Timespan 对象?
【发布时间】:2010-10-10 04:19:38
【问题描述】:

我正在使用带有 DAAB 4.0 框架的 c# 从数据读取器中读取列类型为 dbtype.time 的 MS SQL 2008 数据库的结果。

我的问题是 MSDN 文档说 dbtype.time 应该映射到时间跨度,但我看到的唯一关闭的时间跨度构造函数接受 long,并且从数据读取器返回的结果不能转换为 long,或直接转换为时间跨度.

我找到了这个Article,它显示了datareader.getTimeSpan() 方法,但是daab 4.0 中的datareader 似乎没有这个方法。

那么如何将数据读取器的结果转换为时间跨度对象?

【问题讨论】:

    标签: c# time data-access timespan daab


    【解决方案1】:

    你试过这样的直接投射吗?

    TimeSpan span = (TimeSpan)reader["timeField"];
    

    我刚刚在我的机器上进行了快速测试,当“timeField”是数据库 (SQL) 中的时间数据类型时,它可以正常工作。

    【讨论】:

    • 你和 Ken 的解决方案都很好。但是,如果该值为 null,则 Ken 的解决方案的异常消息更具描述性。 SqlNullValueException - Data is Null. This method or property cannot be called on Null values VS InvalidCastException - Specified cast is not valid.
    • 要回答 BishopBarber 的评论,如果该列可以为空,您应该将其转换为 TimeSpan?可空类型并检查是否为空。 TimeSpan? span = reader["tsfield"] == DBNull.Value ? (TimeSpan?) null : (TimeSpan?) reader["tsfield"]
    • 我发现这个解决方案更好,因为我经常不按索引访问我的数据阅读器。但是,我确实有一个检查 null 的中间方法。
    【解决方案2】:

    GetTimeSpanOleDbDataReaderSqlDataReader 的方法(但不是DAAB 的ExecuteReader 返回的更通用的IDataReader 接口)。我假设 DAAB 返回给您的IDataReader 实例实际上是SqlDataReader 的一个实例。这允许您通过适当地转换 IDataReader 实例来访问 GetTimeSpan 方法:

    using (IDataReader dr = db.ExecuteReader(command))
    {
        /* ... your code ... */
        if (dr is SqlDataReader)
        {
            TimeSpan myTimeSpan = ((SqlDataReader)dr).GetTimeSpan(columnIndex)
        }
        else
        {
            throw new Exception("The DataReader is not a SqlDataReader")
        }
        /* ... your code ... */
    }
    

    编辑:如果IDataReader 实例不是SqlDataReader,那么您可能缺少app.config(或web.config)中定义的连接字符串的provider 属性。

    【讨论】:

      【解决方案3】:

      这是我的看法:

      
      using (IDataReader reader = db.ExecuteReader(command))
      {
          var timeSpan = reader.GetDateTime(index).TimeOfDay;
      }
      

      也许更干净!

      【讨论】:

      • 数据库层在返回TIME 类型时为我抛出InvalidCastException,但我尝试使用GetDateTime() 读取。
      【解决方案4】:

      列值的 .NET 类型是什么?如果它是 DateTime,那么您可以将其 Ticks 属性 (long) 的值传递给 TimeSpan 构造函数。例如。

      var span = new TimeSpan(colValue.Ticks);
      

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 1970-01-01
        • 2012-09-10
        • 2020-04-23
        • 2015-01-17
        • 1970-01-01
        相关资源
        最近更新 更多