2009-02-26 14 views
6

Czytam wynik z MS SQL 2008 Database z typem kolumny dbtype.time ze datareader przy użyciu C# Daab 4,0 ram.Jak przekonwertować wynik Datareader z DbType.Time na obiekt Timespan?

Mój problem polega na tym, że dokumenty MSDN mówią, że dbtype.time powinien być odwzorowany na przedział czasowy, ale jedyny bliski konstruktor dla przedziału czasowego, który widzę, akceptuje długi, a wynik zwrócony z jednostki danych nie może być rzutowany na długi lub bezpośrednio na okres czasu.

Znalazłem to Article, który pokazuje metodę datareader.getTimeSpan(), ale procesor danych w daab 4.0 wydaje się nie mieć tej metody.

Więc jak mogę przekonwertować wynik z datareader do obiektu przedziale czasu?

Odpowiedz

6

GetTimeSpan jest sposób OleDbDataReader i SqlDataReader (lecz nie bardziej ogólnego interfejsu IDataReader które Daab w ExecuteReader powraca). Zakładam, że instancja IDataReader, którą DAAB zwrócił do ciebie, jest w rzeczywistości instancją SqlDataReader. To pozwala na dostęp do metody GetTimeSpan oddając instancję IDataReader o odpowiednich:

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

Edycja: Jeśli wystąpienie IDataReader nie jest SqlDataReader to może brakować atrybutu provider w ciągu połączenia zdefiniowane w app.config (lub web.config).

0

Jaki jest typ .NET wartości kolumny? Jeśli jest to DateTime, możesz przekazać wartość jego właściwości Ticks (long) do konstruktora TimeSpan. Na przykład.

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

Czy próbowałeś już takiej obsady?

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

Po prostu przetestowałem to szybko na moim komputerze i działa dobrze, gdy "timeField" jest typem danych czasu w bazie danych (SQL).

+0

waszą i Kena rozwiązania są dobre. Jeśli jednak wartość jest zerowa, komunikat wyjątku rozwiązania Kena jest bardziej opisowy. 'SqlNullValueException - Dane mają wartość Null. Ta metoda lub właściwość nie może zostać wywołana przy wartościach Null "VS" InvalidCastException - Określony rzut nie jest prawidłowy ". – TheWanderingMind

+1

Aby odpowiedzieć na komentarz BishopBarbera, czy kolumnę można unieważnić, należy ją przekonwertować na TimeSpan? typ zerowy i sprawdź zero. 'TimeSpan? span = reader ["tsfield"] == DBNull.Value? (? TimeSpan) null: (?) Czytnik TimeSpan [ "tsfield"] ' –

+0

znalazłem to rozwiązanie lepsze, bo często nie uzyskać dostępu do danych przez czytnik indeksu. Mam jednak metodę pośrednią, która sprawdza zerowość. – MichaelChan

1

Oto moje zdanie:


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

Cleaner, być może!

+0

Warstwa bazy danych generuje 'InvalidCastException' dla mnie, kiedy zwraca' typ oddać porównywalnych towarów, ale staram się czytać z 'GetDateTime()'. – binki

Powiązane problemy