我正在从一个MS SQL 2008数据库中读取一个结果,该数据库的列类型为dbtype.time,来自datareader,使用带有DAAB 4.0框架的c#。
我的问题是MSDN文档说dbtype.time应该映射到一个时间跨度但是我看到的唯一接近时间跨度的接近构造函数接受一个long,并且从datareader返回的结果不能强制转换为long,或直接转换为时间跨度。
我发现这个Article显示了datareader.getTimeSpan()方法,但daab 4.0中的datareader似乎没有这个方法。
那么如何将结果从datareader转换为时间跨度对象?
答案 0 :(得分:10)
你有没有试过像这样的直接演员?
TimeSpan span = (TimeSpan)reader["timeField"];
我刚刚在我的机器上测试了这个,并且当“timeField”是数据库中的Time数据类型(SQL)时工作正常。
答案 1 :(得分:6)
GetTimeSpan
是OleDbDataReader
和SqlDataReader
的方法(但不是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);