C# 如何将DbType.Time的Datareader结果转换为Timespan对象?
我正在使用c#with DAAB 4.0框架从datareader读取一个列类型为dbtype.time的MS SQL 2008数据库的结果 我的问题是MSDN文档说dbtype.time应该映射到timespan,但是我看到的timespan的唯一关闭构造函数接受long,并且从datareader返回的结果不能转换为long,也不能直接转换为timespan 我发现它显示了datareader.getTimeSpan()方法,但是daab 4.0中的datareader似乎没有这个方法C# 如何将DbType.Time的Datareader结果转换为Timespan对象?,c#,time,data-access,timespan,daab,C#,Time,Data Access,Timespan,Daab,我正在使用c#with DAAB 4.0框架从datareader读取一个列类型为dbtype.time的MS SQL 2008数据库的结果 我的问题是MSDN文档说dbtype.time应该映射到timespan,但是我看到的timespan的唯一关闭构造函数接受long,并且从datareader返回的结果不能转换为long,也不能直接转换为timespan 我发现它显示了datareader.getTimeSpan()方法,但是daab 4.0中的datareader似乎没有这个方法 那么
那么,如何将数据读取器的结果转换为timespan对象呢?
GetTimeSpan
是一种方法,用于OleDbDataReader
和SqlDataReader
(但不是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
,则可能缺少app.config(或web.config)中定义的连接字符串的provider
属性。列值的.NET类型是什么?如果是DateTime,则可以将其Ticks属性(long)的值传递给TimeSpan构造函数。例如
var span = new TimeSpan(colValue.Ticks);
你试过这样的直接演员吗
TimeSpan span = (TimeSpan)reader["timeField"];
我只是在我的机器上快速地测试了这一点,当“timeField”是数据库(SQL)中的时间数据类型时,它可以正常工作。以下是我的看法:
using (IDataReader reader = db.ExecuteReader(command))
{
var timeSpan = reader.GetDateTime(index).TimeOfDay;
}
也许更干净 你和肯的解决方案都很好。但是,如果该值为null,Ken的解决方案的异常消息更具描述性<代码>SqlNullValueException-数据为空。无法对空值调用此方法或属性VS
InvalidCastException-指定的强制转换无效
。若要回答BishopBarber注释,如果列可以为空,则应将其转换为TimeSpan?可为null的类型并检查是否为null<代码>时间跨度?span=reader[“tsfield”]==DBNull.Value?(TimeSpan?)null:(TimeSpan?)reader[“tsfield”]我发现这个解决方案更好,因为我经常不通过索引访问我的数据读取器。但是,我确实有一个检查null的中间方法。当数据库层返回TIME
类型,但我尝试使用GetDateTime()
读取时,它会为我抛出一个InvalidCastException
。