Apakah ada perbedaan antara null dan System.DBNull.Value? Jika ya, apa itu?
Saya memperhatikan 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 if(rdr["Id"] != null)
dikembalikan true
dan akhirnya melemparkan pengecualian untuk memberikan null sebagai integer.
Tapi, ini jika saya menggunakan if (rdr["Id"] != System.DBNull.Value)
pengembalian false
.
Apa perbedaan antara null dan System.DBNull.Value?
System.Data
, dan yang lainnya adalah nilai khusus yang menandakan kurangnya referensi. Mereka tidak ada hubungannya satu sama lain. Bisakah Anda menjelaskan apa yang membuat Anda bingung? Apakah pertanyaan Anda yang sebenarnya "mengapa melakukanDataRows
danDataReaders
menempatkanDBNull.Value
diri mereka sendiri, bukannull
?"null
.Jawaban:
Yah,
null
bukan contoh jenis apa pun. Sebaliknya, ini adalah referensi yang tidak valid.Namun,
System.DbNull.Value
adalah referensi yang valid ke instanceSystem.DbNull
(System.DbNull
adalah singleton danSystem.DbNull.Value
memberi Anda referensi ke instance tunggal dari kelas itu) yang mewakili nilai yang tidak ada * dalam database.* Biasanya kami akan mengatakannya
null
, tetapi saya tidak ingin mengacaukan masalahnya.Jadi, ada perbedaan konseptual yang besar di antara keduanya. Kata kunci
null
mewakili referensi yang tidak valid. KelasSystem.DbNull
mewakili nilai yang tidak ada dalam bidang database. Secara umum, kita harus mencoba menghindari penggunaan hal yang sama (dalam kasus ininull
) untuk merepresentasikan dua konsep yang sangat berbeda (dalam hal ini referensi yang tidak valid versus nilai yang tidak ada dalam field database).Perlu diingat, inilah mengapa banyak orang menganjurkan menggunakan pola objek nol secara umum, yang merupakan
System.DbNull
contoh.sumber
IDbCommand.ExecuteScalar()
, dapat mengembalikan null (tidak ada catatan yang dikembalikan) atauDbNull
(kolom pertama dalam catatan pertama adalah 'nilai yang tidak ada'). TanpanyaDbNull
Anda tidak akan bisa membedakan yang satu dari yang lain.Dari dokumentasi kelas DBNull :
sumber
DBNull.Value menjengkelkan untuk ditangani.
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; }
Selain itu, 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.
sumber
DBNull.Value adalah apa yang dikembalikan penyedia .NET Database untuk mewakili entri null dalam database. DBNull.Value bukan null dan perbandingan dengan 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
sumber
DataRow memiliki metode yang disebut
IsNull()
yang dapat Anda gunakan untuk menguji kolom jika memiliki nilai null - terkait dengan null seperti yang terlihat oleh database.DataRow["col"]==null
akan selalufalse
.menggunakan
DataRow r; if (r.IsNull("col")) ...
sebagai gantinya.
sumber
Null mirip dengan penunjuk nol di C ++ . Jadi ini adalah referensi yang tidak menunjuk pada nilai apapun .
DBNull.Value
benar-benar berbeda dan merupakan konstanta yang dikembalikan ketika nilai bidang berisi NULL.sumber