Как преобразовать результат Datareader из DbType.Time в объект Timespan? - PullRequest
6 голосов
/ 26 февраля 2009

Я читаю результат из базы данных MS SQL 2008 с типом столбца dbtype.time из устройства чтения данных, используя c # с платформой DAAB 4.0.

Моя проблема в том, что документы MSDN говорят, что dbtype.time должен сопоставляться с временным промежутком, но единственный закрывающий конструктор для временного промежутка, который я вижу, принимает длинное, а результат, возвращаемый из устройства чтения данных, не может быть приведен к длинному или непосредственно к временному промежутку. ,

Я нашел эту Статью , в которой показан метод datareader.getTimeSpan (), но, как представляется, в dabareader в daab 4.0 этот метод отсутствует.

Итак, как мне преобразовать результат из хранилища данных в объект временного диапазона?

Ответы [ 4 ]

10 голосов
/ 26 февраля 2009

Вы пробовали прямой бросок как это?

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

Я только что быстро проверил это на своей машине и отлично работает, когда "timeField" является типом данных Time в базе данных (SQL).

6 голосов
/ 26 февраля 2009

GetTimeSpan - это метод OleDbDataReader и SqlDataReader (но не более общего интерфейса IDataReader, который возвращает DAAB ExecuteReader). Я предполагаю, что экземпляр IDataReader, который DAAB вернул вам, на самом деле является экземпляром 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).

1 голос
/ 09 февраля 2011

Вот мой дубль:


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

Очиститель, возможно!

0 голосов
/ 26 февраля 2009

Что такое тип .NET значения столбца? Если это DateTime, то вы можете передать значение его свойства Ticks (long) в конструктор TimeSpan. Например.

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