2011-10-07 18 views
43

Bir sqldatatime.minvalue öğesini bir datetime nesnesine dönüştüremiyorum. Nasıl sqtdatetime.minvalue datetime dönüşür?

Denedim: Açıkçası işe yaramadı Yani

Datetime dt = Convert.ToDateTime(SqlDateTime.MinValue); 

.

+0

Bunun için teşekkürler. Kodunuz bana bir SQL iadesi okumada yardımcı oldu 'DateTime dateValue = Convert.ToDateTime (reader.GetValue (8));' –

cevap

62

Herhangi bir nedenle explicit conversion operator'u kullanmamak için? benim için çalışıyor

DateTime dt = (DateTime) SqlDateTime.MinValue; 

:

using System; 
using System.Data.SqlTypes; 

class Test 
{ 
    static void Main() 
    { 
     DateTime dt = (DateTime) SqlDateTime.MinValue; 
     Console.WriteLine(dt); 
    } 
} 
+0

Neden bu işe yarar ve Convert.ToDateTime() garip değil mi? – codecompleting

+4

@codecompleting, "Convert.ToDateTime", "SqlDateTime" değerini desteklemek için düzgün bir aşırı yüklenmeye gereksinim duyar. 'Convert''ın tasarımcıları, 'SqlDateTime'ın tasarımcıları kesinlikle bunu dikkate almamış olmalıydı. –

126

dönüştürmek gerek yok. SqlDateTime, DateTime değerini döndüren Value özelliğine sahiptir.

DateTime dt = SqlDateTime.MinValue.Value; 
+30

Jon Skeets :-) – PeteT

+1

için daha iyi bir cevabın olduğu nadir bir soru geldiğini görmedim. –

14

Aldığınız yanıtlar, değeri dönüştürmenin iki farklı yolunu size göstermiştir. Biri, SqlDateTime için DateTime için tanımlanan bir açık dönüşüm kullanmaktır, diğeri ise DateTime döndüren SqlDateTime örneğindeki .Value özelliğine erişmektir.

var date = theSqlDate.Value; // via property 
var date = (DateTime)theSqlDate; // via explicit conversion 

Dikkate değer değerlikler vardır. SqlDateTime, SqlDateTime.Null değeri aracılığıyla veritabanındaki boş değerler kavramını (DBNull, başka bir silinmiş yanıtla başvurulan) destekler. Bir "null" örneğindeki Value özelliğine erişirseniz, SqlNullValueException'a girersiniz. Öte yandan, DateTime'a açık bir dönüşüm {January 1, 1900 12:00:00 AM} ile sonuçlanır. Bu sonuçların hiçbiri kodunuzda istenmeyebilir. Geçersiz bir varsayılan değerle veritabanında geçerli bir boş girdinin üzerine yazmak, çalışma zamanında bir istisna almak kadar kötü olabilir. Eğer veritabanında bir null sütun var ve SqlDateTime ile çalışıyorsanız, açıkça test ve farklı SqlDateTime.Null tedavi etmek gerekebilir ve o zaman başka değerler dönüştürmek için almak yaklaşımı hangi önemli olmayabilir Eğer

.

DateTime? date; 
if (theSqlDate.Equals(SqlDateTime.Null)) 
    date = null 
else 
    date = theSqlDate.Value; // or (DateTime)theSqlDate; 
+5

Jon Skeet'den daha iyi bir cevaptan daha iyi olan nadir bir cevap. –