如何将DbType.Time的Datareader结果转换为Timespan对象?

时间:2009-02-26 19:57:08

标签: c# time data-access timespan daab

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

我的问题是MSDN文档说dbtype.time应该映射到一个时间跨度但是我看​​到的唯一接近时间跨度的接近构造函数接受一个long,并且从datareader返回的结果不能强制转换为long,或直接转换为时间跨度。

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

那么如何将结果从datareader转换为时间跨度对象?

4 个答案:

答案 0 :(得分:10)

你有没有试过像这样的直接演员?

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

我刚刚在我的机器上测试了这个,并且当“timeField”是数据库中的Time数据类型(SQL)时工作正常。

答案 1 :(得分:6)

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

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属性。

答案 2 :(得分:1)

这是我的看法:


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

清洁,也许!

答案 3 :(得分:0)

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

var span = new TimeSpan(colValue.Ticks);