6

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

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

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

那么如何将数据读取器的结果转换为时间跨度对象呢?

4

4 回答 4

10

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

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

I just tested this quickly on my machine and works fine when "timeField" is a Time datatype in the database (SQL).

于 2009-02-26T20:08:34.127 回答
7

GetTimeSpanOleDbDataReaderand的一个方法SqlDataReader(但不是 DAABExecuteReader返回的更通用的 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 ... */
}

编辑:如果IDataReader实例不是,SqlDataReader那么您可能缺少provider在 app.config(或 web.config)中定义的连接字符串的属性。

于 2009-02-26T20:05:05.790 回答
1

Here's my take:


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

Cleaner, perhaps!

于 2011-02-09T18:21:55.530 回答
0

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

var span = new TimeSpan(colValue.Ticks);
于 2009-02-26T20:05:50.920 回答