Pertanyaan Apa perbedaan antara null dan System.DBNull.Value?


Apakah ada perbedaan antara null dan System.DBNull.Value? Jika ya, apa itu?

Saya perhatikan perilaku ini sekarang -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

Sementara saya mengambil data dari database menggunakan datareader sql, meskipun tidak ada nilai yang dikembalikan if(rdr["Id"] != null) dikembalikan true dan akhirnya melemparkan pengecualian untuk mentransmisikan null sebagai integer.

Tapi, ini jika saya gunakan if (rdr["Id"] != System.DBNull.Value) kembali false.

Apa perbedaan antara null dan System.DBNull.Value?


76
2018-02-10 14:33


asal


Jawaban:


Baik, null bukan merupakan contoh jenis apa pun. Sebaliknya, itu adalah referensi yang tidak valid.

Namun, System.DbNull.Value, adalah referensi yang valid untuk turunan dari System.DbNull (System.DbNull adalah tunggal dan System.DbNull.Value memberi Anda referensi ke contoh tunggal dari kelas itu) yang mewakili tidak ada* nilai dalam database.

* Kami biasanya mengatakan null, tapi saya tidak ingin mengacaukan masalah.

Jadi, ada perbedaan konseptual yang besar di antara keduanya. Kata kunci null merupakan referensi yang tidak valid. Kelas System.DbNull mewakili nilai yang tidak ada di bidang basis data. Secara umum, kita harus mencoba menghindari menggunakan hal yang sama (dalam hal ini null) untuk mewakili dua konsep yang sangat berbeda (dalam hal ini referensi tidak valid versus nilai yang tidak ada di bidang database).

Perlu diingat, inilah mengapa banyak orang menganjurkan menggunakan pola objek nol secara umum, itulah tepatnya apa System.DbNull adalah contoh dari.


95
2018-02-10 14:36



Dari dokumentasi tersebut Kelas DBNull:

Jangan bingung pengertian null dalam bahasa pemrograman object-oriented dengan objek DBNull. Dalam bahasa pemrograman berorientasi objek, null berarti tidak adanya referensi ke objek. DBNull mewakili varian terinisialisasi atau kolom basis data yang tidak ada.


20
2018-02-10 14:38



DBNull.Nilai mengganggu yang harus dihadapi.

Saya menggunakan metode statis yang memeriksa apakah itu DBNull dan kemudian mengembalikan nilainya.

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

Juga, ketika memasukkan nilai ke dalam DataRow, Anda tidak dapat menggunakan "null", Anda harus menggunakan DBNull.Value.

Memiliki dua representasi "nol" adalah desain yang buruk tanpa manfaat yang jelas.


9
2018-06-25 22:34



DBNull.Value adalah apa yang penyedia NET Database. Kembali untuk mewakili entri nol dalam database. DBNull.Value tidak null dan comparissons to null untuk nilai kolom yang diambil dari baris database tidak akan berfungsi, Anda harus selalu membandingkan dengan DBNull.Value.

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx


5
2018-02-10 14:35



DataRow memiliki metode yang disebut IsNull() yang dapat Anda gunakan untuk menguji kolom jika memiliki nilai null - terkait dengan null seperti yang dilihat oleh database.

DataRow["col"]==null akan selalu begitu false.

menggunakan

DataRow r;
if (r.IsNull("col")) ...

sebagai gantinya.


3
2018-02-10 14:37



Null mirip dengan pointer nol dalam C ++. Jadi itu a referensi yang tidak menunjuk ke nilai apa pun.

DBNull.Value benar-benar berbeda dan merupakan a konstan yang dikembalikan ketika nilai bidang berisi NULL.


3
2018-02-10 14:38