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

Ele*_*ent 6 c# time timespan data-access daab

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

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

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

那么如何将结果从datareader转换为timepan对象?

BFr*_*ree 10

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

TimeSpan span = (TimeSpan)reader["timeField"];
Run Code Online (Sandbox Code Playgroud)

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

  • 要回答 BishopBarber 评论,如果该列可以为空,您应该将其转换为 TimeSpan?可为空类型并检查是否为空。`时间跨度?span = reader["tsfield"] == DBNull.Value ? (TimeSpan?) null : (TimeSpan?) reader["tsfield"]` (2认同)

Ken*_*ing 6

GetTimeSpanOleDbDataReaderSqlDataReader(但不是DAAB ExecuteReader返回的更通用的IDataReader接口的方法).我假设IDataReaderDAAB返回给你的实例实际上是一个实例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 ... */
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果IDataReader实例不是a,SqlDataReader则可能缺少providerapp.config(或web.config)中定义的连接字符串的属性.