2009-02-26 22 views
6

Bir MS SQL 2008 Veritabanından dbtype.time sütun türüne sahip bir MS SQL 2008 Veritabanından, DAAB 4.0 çerçevesiyle C# kullanarak bir sonuç okuyorum.DbType.Time Datapaner Sonuç Timespan Nesne Nasıl Dönüştürülür?

Sorunum, MSDN dokümanlar dbtype.time bir zaman çizelgesiyle eşleşmesi gerektiğini, ancak gördüğüm zaman çizelgesi için yalnızca yakın kurucunun uzun olduğunu kabul ettiği ve veri okuyucusundan döndürülen sonucun uzun veya doğrudan zaman aralığı.

Bu Article datareader.getTimeSpan() yöntemini gösteren verileri buldum, ancak daab 4.0'daki datareader bu yönteme sahip görünmüyor.

Sonuç, sonucu veri okuyucudan zaman çizelgesi nesnesine nasıl dönüştürebilirim?

cevap

6

GetTimeSpanOleDbDataReader ve SqlDataReader bir yöntemdir (ancak daha genel IDataReader arayüzünün olan DAAB en ExecuteReader döner). DAAB'ın size iade ettiği IDataReader örneğinin aslında bir SqlDataReader örneğidir. Bu appropiately IDataReader örneğini döküm tarafından GetTimeSpan yöntemi erişmesini sağlar:

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

Düzenleme: IDataReader örneği o zaman app.config tanımlanan bağlantı dizesi provider özelliği eksik olabilecek bir SqlDataReader değilse (veya web.config).

0

Sütun değeri .NET türü nedir? Bir DateTime ise, Ticks özelliğinin değerini (uzun) TimeSpan yapıcısına iletebilirsiniz. Örneğin.

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

Böyle bir doğrudan döküm yapmayı denediniz mi?

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

Sadece benim makinede hızla bu test edilmiş ve "timeField" veritabanına (SQL) bir süre veri türü olduğunda iyi çalışır.


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

Temizleyici, belki:

+0

Hem senin hem de Ken'in çözümleri iyi. Bununla birlikte, değer boşsa, Ken'in çözümünün istisna mesajı daha açıklayıcıdır. 'SqlNullValueException - Veri Boş. Bu yöntem veya özellik boş değerlerde çağrılmaz 'VS' InvalidCastException - Belirtilen döküm geçerli değil '. – TheWanderingMind

+1

Eğer sütun null olabilir eğer BishopBarber yorum cevap vermek için TimeSpan'a dönüştürmelisiniz? NULL türünü ve null değerini kontrol edin. 'ZamanGeçişi? span = okuyucu ["tsfield"] == DBNull.Value? (TimeSpan?) Null: (TimeSpan?) Okuyucu ["tsfield"] ' –

+0

Bu çözümü daha iyi buldum çünkü genellikle veri okuyucuma dizin yoluyla erişemiyorum. Ancak, null'u denetleyen bir ara yöntemim var. – MichaelChan

1

İşte benim alabilir!

+0

Veritabanı katmanı bir 'TIME 'türünü döndürdüğümde' InvalidCastException' atar ancak 'GetDateTime()' ile okumaya çalışıyorum. – binki