2009-02-26 18 views
6

我正在使用C#和DAAB 4.0框架从数据读取器中读取列类型为dbtype.time的MS SQL 2008数据库的结果。如何将DbType.Time的Datareader结果转换为Timespan对象?

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

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

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

回答

6

GetTimeSpanOleDbDataReaderSqlDataReader(但不是DAAB的ExecuteReader返回的更通用的IDataReader接口)的方法。我假设DAAB返回给您的IDataReader实例实际上是SqlDataReader的一个实例。这允许您通过铸造appropiately的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,那么你可能会丢失您的连接字符串的provider属性,在规定的app.config (或web.config)。

0

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

var span = new TimeSpan(colValue.Ticks); 
9

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

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

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

+0

你和Ken的解决方案都很好。但是,如果值为空,Ken的解决方案的异常消息更具描述性。 `SqlNullValueException - 数据为空。此方法或属性无法在空值上调用VS'InvalidCastException - 指定的转换无效。 – TheWanderingMind 2015-05-05 15:28:56

+1

要回答BishopBarber评论,如果列可以为空,你应该将其转换为TimeSpan?可为空类型并检查null。 `时间跨度? span = reader [“tsfield”] == DBNull.Value? (TimeSpan?)null:(TimeSpan?)reader [“tsfield”]` – 2016-06-21 07:39:50

1

这是我的看法:


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

清洁,也许!

相关问题