SORU
20 Aralık 2010, PAZARTESİ


DBNull anlamı nedir?

.NET var null başvuru, kullanılan her yerde göstermek için bir nesne referansı boş, ve sonra DBNull, kullanılan veritabanı sürücüleri (ve birkaç Diğerleri) göstermek... hemen hemen aynı şey. Doğal olarak, bu büyük bir karışıklık yaratır ve dönüşüm rutinleri, Steve, vb.

Neden orijinal yaptım .NET yazarlar bu yapmaya karar verdin? Bana mantıklı gelmiyor. Onların belgeleri de hiç mantıklı değil:

DBNull sınıf varolmayan bir değeri temsil eder. Örneğin, bir veritabanı, bir tablo, bir satır, bir sütun herhangi bir veri yoktur içerebilir. Bu sütun yalnızca bir değer yerine tüm varlığını kabul edilmez. DBNull nesnesi var olmayan sütunu temsil eder. Buna ek olarak, COM birlikte çalışabilirlik DBNull sınıfı var olmayan bir değer gösterir VT_NULL bir değişken ve belirsiz bir değer gösterir VT_EMPTY bir türevi, ayırt etmek için kullanır.

Bir bu saçmalık da ne "olmamak" mı? sütun Bir sütun, sadece belirli bir satır için bir önemi yok mu var. Eğer çıkmadığına eğer doğru değilse, bir özel durum, belirli bir hücre, DBNull bir değil erişmeye çalışıyor olsun istiyorum! VT_NULL VT_EMPTY ama sonra neden COMEmpty bir sınıf yapmak yerine değil ayırt etmek için ihtiyaç anlayabilirim? Bu çok daha güzel bir uyum olurdu .NET çerçeve.

Bir şey mi kaçırdım? Herkes DBNull niye icat edildiğini ve çözmeye yardımcı olur ne biraz ışık tutabilir?

CEVAP
9 Mart 2012, Cuma


Eğilim burada pek aynı fikirde değilim. Kayıt devam edeceğim:

DBNull yararlı bir amaca hizmet ettiğini kabul etmiyorum; hemen hemen hiç değer katarken, gereksiz karışıklığa ekler.

Argüman genellikle null geçersiz bir başvurusu olan ve DBNull null nesne bir tip olduğunu ortaya koyarikisi de doğru değil. Örneğin:

int? x = null;

bu bir "geçersiz başvuru"; null bir değerdir. Nitekim null ne demek istiyorsun yani, açıkçası, ben hiçbir sorun ile çalışma değerleri olabilir null (hatta SQL ihtiyacımız var doğru çalışması ile null - değişen bir şey yok burada). Aynı şekilde, "null object pattern" sadece mantıklı Eğer gerçekten bunun gibi bir nesne OOP açısından, ama eğer biz bir değeri olabilir "değerimiz, ya da DBNull" demek object, olamayız, bir şeyler yapmanın yararlı.

DBNull ile çok fazla kötü şey var:

  • object DBNull tutabilir beri sadece object ile çalışmak için zorlaryabaşka bir değer
  • arasında gerçek bir fark yoktur "veya DBNull bir değeri olabilir" vs "ya null bir değeri olabilir"
  • 1.1 (pre-null-türleri) kaynaklanıyor bu tartışma anlamsız; null çok iyi 1.1 kullanabiliriz
  • en API "boş mu?" yöntemler, örneğin DBDataReader.IsDBNull veya her ikisi de aslında DBNull API bakımından farklılıklar gerektirir DataRow.IsNull -....
  • DBNull boş birleşiyor şartları; value ?? defaultValue değer DBNull eğer işe yaramazsa başarısız
  • DBNull.Value sabit olmadığı için isteğe bağlı parametreler kullanılabilir
  • DBNull çalışma mantığı belli aslında DBNull - eşittir null; anlamı aynıdırdeğilSQL semantik temsil etme işi
  • genellikle değer türü değerleri aşırı kullanır object beri kutulu zorlar
  • eğer DBNull için test etmek istiyorsanız da null için test olabilir
  • neden büyük sorunlara şeyler gibi komut parametre, bir çok aptalca bir davranış, eğer bir parametre vardır null değer değil mi yolladı... işte bir fikir: eğer istemiyorsan bir parametre gönderdikparametreler koleksiyon eklemek yok
  • aklıma gelen her ORM gayet iyi çalışırherhangi birADO.NET kodu konuşurken ya DBNull fazladan bir baş belası olarak dışında kullanılması gerekir

Tekuzaktan bileben zaten ikna edici bir argümanhiçbu haklı görüldüvarlığıböyle bir değerdir DataTable, zaman geçirmeden değerleri için yeni bir satır; null anlamına gelen "use default", bir DBNull açıkça boş açıkçası bu API olabilirdi belirli bir tedavi için bu durum bir hayali DataRow.DefaultValue örnek versen çok daha iyi tanıtan bir DBNull.Value bunu bozar büyük boşluklar kod için bir sebep yok.

Aynı şekilde, ExecuteScalar senaryo... eğer skaler bir yöntem yürütme, en iyi ihtimalle zayıf; senbekliyoruzsonuç. Satır yok hiçbir yerde bu senaryoda, null dönen çok korkunç görünmüyor. Eğer kesinlikle "satır" ve "tek bir boş", okuyucu var API. iade arasındaki belirsizliği ortadan kaldırmak için gerekiyorsa

Bu çıkalı yıllar oldu, ve şimdiye kadar bunu düzeltmek için çok geç. Ama! Yapın lütfendeğilherkes bu bir "" şey. ortada taraftarı olduğunu düşünüyorum Geliştiriciler yapmak çokdeğilKORUYUCU bu garip kırışıklık değer görüyor.

Aslında eğer bu iki şeyden kaynaklanıyor diye merak ediyorum:

  • kelime Nothing kullanmak yerine bir şey içeren "boş" VB
  • bize mümkün if(value is DBNull) sözdizimi olan varlık "sadece SQL gibi görünüyor", yerine çok zor if(value==null)

Özet:

3 seçenek (null, DBNull ya da gerçek değer) olması, 3 farklı durumlar arasındaki belirsizliği ortadan kaldırmak için gereken orijinal bir örnek ise orada sadece yararlıdır. Ben henüz görmeye fırsat nerede ihtiyacım temsil etmek için iki farklı "boş" Devletleri, yani DBNull tamamen gereksiz verilen bu null zaten var ve çok daha iyi Dil ve çalışma zamanı desteği.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Baby Big Mouth

    Baby Big Mou

    5 Mart 2013
  • Grace Su

    Grace Su

    6 Ocak 2006
  • thewinekone

    thewinekone

    17 Aralık 2005