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

发布于 2024-07-14 15:13:45 字数 409 浏览 9 评论 0原文

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

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

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

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

I am reading a result from a MS SQL 2008 Database with a column type of dbtype.time from a datareader, using c# with DAAB 4.0 framework.

My problem is the MSDN docs say dbtype.time should map to a timespan but the only close constructor for timespan I see accepts a long, and the result returned from the datareader cannot be cast to a long, or directly to a timespan.

I found this Article whichs shows datareader.getTimeSpan() method, but the datareader in daab 4.0 does not seem to have this method.

So how do I convert the result from the datareader to a timespan object ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

落叶缤纷 2024-07-21 15:13:45

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

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

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

Have you tried a direct cast like this?

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).

看春风乍起 2024-07-21 15:13:45

GetTimeSpanOleDbDataReaderSqlDataReader 的方法(但不是 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< /code> 那么您可能会缺少 app.config(或 web.config)中定义的连接字符串的 provider 属性。

GetTimeSpan is a method of OleDbDataReader and SqlDataReader (but not of the more generic IDataReader interface which DAAB's ExecuteReader returns). I'm assuming that the IDataReader instance which DAAB has returned to you is actually an instance of SqlDataReader. This allows you to access the GetTimeSpan method by casting the IDataReader instance appropiately:

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 ... */
}

Edit: If the IDataReader instance is not a SqlDataReader then you might be missing the provider attribute of your connection string defined in your app.config (or web.config).

标点 2024-07-21 15:13:45

这是我的看法:


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

也许更干净!

Here's my take:


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

Cleaner, perhaps!

琉璃梦幻 2024-07-21 15:13:45

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

var span = new TimeSpan(colValue.Ticks);

What is the .NET type of the column value? If it is a DateTime then you can pass the value of its Ticks property (long) to the TimeSpan constructor. E.g.

var span = new TimeSpan(colValue.Ticks);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文