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

C# 如何将DbType.Time的Datareader结果转换为Timespan对象?,c#,time,data-access,timespan,daab,C#,Time,Data Access,Timespan,Daab,我正在使用c#with DAAB 4.0框架从datareader读取一个列类型为dbtype.time的MS SQL 2008数据库的结果 我的问题是MSDN文档说dbtype.time应该映射到timespan,但是我看到的timespan的唯一关闭构造函数接受long,并且从datareader返回的结果不能转换为long,也不能直接转换为timespan 我发现它显示了datareader.getTimeSpan()方法,但是daab 4.0中的datareader似乎没有这个方法 那么

我正在使用c#with DAAB 4.0框架从datareader读取一个列类型为dbtype.time的MS SQL 2008数据库的结果

我的问题是MSDN文档说dbtype.time应该映射到timespan,但是我看到的timespan的唯一关闭构造函数接受long,并且从datareader返回的结果不能转换为long,也不能直接转换为timespan

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


那么,如何将数据读取器的结果转换为timespan对象呢?

GetTimeSpan
是一种方法,用于
OleDbDataReader
SqlDataReader
(但不是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
属性。

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

var span = new TimeSpan(colValue.Ticks);

你试过这样的直接演员吗

TimeSpan span = (TimeSpan)reader["timeField"];
我只是在我的机器上快速地测试了这一点,当“timeField”是数据库(SQL)中的时间数据类型时,它可以正常工作。

以下是我的看法:


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

也许更干净

你和肯的解决方案都很好。但是,如果该值为null,Ken的解决方案的异常消息更具描述性<代码>SqlNullValueException-数据为空。无法对空值调用此方法或属性VS
InvalidCastException-指定的强制转换无效
。若要回答BishopBarber注释,如果列可以为空,则应将其转换为TimeSpan?可为null的类型并检查是否为null<代码>时间跨度?span=reader[“tsfield”]==DBNull.Value?(TimeSpan?)null:(TimeSpan?)reader[“tsfield”]我发现这个解决方案更好,因为我经常不通过索引访问我的数据读取器。但是,我确实有一个检查null的中间方法。当数据库层返回
TIME
类型,但我尝试使用
GetDateTime()
读取时,它会为我抛出一个
InvalidCastException