2010-08-06 16 views
7

Sınıfı tanımladım Şahıs özelliği Doğum tarihinullable DateTime?, niçin null birleştirici operatör aşağıdaki örnekte çalışmamalıdır?C# ?? null birleştiren operatör sorusu

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value =  
    person.Birthday ?? DBNull.Value; 

Derleyici, "Operatör" oldu mu? 'System.DateTime' türünde işlenenlere uygulanamaz? ve 'System.DBNull'"

da bir derleme hatası var şu: Refactor tarafından tavsiye ve derlenmiş, ancak düzgün çalışmadı olarak

cmd.Parameters.Add(new SqlParameter("@Birthday", 
    SqlDbType.SmallDateTime)).Value = 
    (person.Birthday == null) ? person.Birthday:DBNull.Value; 

I (nesne) bir döküm eklendi ve Değer her iki durumda da null olarak sqlserver db'de saklandı.

SqlDbType.SmallDateTime)).Value =  
     person.Birthday ?? (object)DBNull.Value; 

birisi burada neler olduğunu açıklayabilir misiniz?

if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
     = DBNull.Value; 
    else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
      person.Birthday; 
+3

http://stackoverflow.com/questions/218808/c-ado-net-nulls-and-dbnull-is-there-more-efficient-syntax Çoğaltması – sgriffinusa

+0

Bunu diğer gönderiden aldım: SqlDbType.SmallDateTime)) .Value = kişi.Birthday ?? (Nesne) DBNull.Value; Teşekkürler! –

cevap

20

sorun onlara boş kaynaştırma operatörünü kullanamaması için DateTime? ve DBNull.Value aynı tip olmaması:

aşağıdaki beceriksiz kodu kullanmak gerekiyordu. Senin durumunda

Eğer İlk sorun ?? veya ?: operatör için, her iki seçim için nesnenin aynı türde olmalıdır olmasıdır

3

Add() kadar tip object değeri geçmesine person.Birthday ?? (object)DBNull.Value yapabilirsiniz. İşte farklı tipler.

+1

Peki, nedir? edit: nevermind, biliyordum, daha önce hiç böyle bir araya getirilen 2 sembolleri görmedim. http://msdn.microsoft.com/en-us/library/ty67wk28.aspx –

3

Ben mesela, sadece uygun şekilde DBNull için boş tüm örneklerini değişen, sorguyu çalıştırmadan önce benim parametreleri üzerinde yineleme tercih:

foreach (IDataParameter param in cmd.Parameters) 
    if (param.Value == null) 
     param.Value = DBNull.Value; 

Bu beni olduğu gibi boş değerler bırakıp sadece onları takas sağlayan daha sonra maskelemek.

+0

Bana göre bu temiz ve basit, iyi bir cevap. –

+0

Buradaki sorunum, gerçeği takip eden parametrelere göre tekrar tekrar işlenmenin ekstra yüküdür. – Andrew