天天看點

NULL和DBNull的差別分析

測試準備:

1.建立一個表

CREATE TABLE `cacb` (

  `CA` varchar(255) DEFAULT NULL,

  `CB` varchar(255) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.建立一個控制台項目,主函數實作如下:

 #region Mysql DBNull測試

            string con = "server=localhost;User Id=root;database=mytest;password=my88888;persist security info=True;charset=utf8;";

            bool flg = null is object;//false

            bool fdb = DBNull.Value is object;//true

            string sql = "SELECT * from CACB  limit 1,1;";

            using (MySqlConnection mc=new MySqlConnection(con))

            {

                mc.Open();

                using (MySqlCommand com=new MySqlCommand(sql,mc))

                {

                     var result= com.ExecuteScalar();

                     if (result==DBNull.Value)

                     {

                         Console.WriteLine("這個确定是資料庫空的了");

                     }

                     if (result==null)

                     {

                         Console.WriteLine("這裡是null了.");

                     }

                }

            }

            #endregion

3.結論:DBNull是針對那些查詢出來的值為Null的資料,繼承Object,null是.net裡面的一種類型資料不繼承Object,說白了就是,DBNull是資料庫的預設空值,而null是.net的預設值空值。那麼row[column].ToString() 這個寫法永遠不會在ToString那裡發生NullReferenceException。

需要引起注意的是: ExecuteScalar的規則是,傳回第一列,第一行的資料。假如有第一行,但是第一列為空,那麼傳回的是DBNull 。假如一行都沒有,那麼ExecuteScalar就傳回null,假如第一列第一行不為空,那麼ExecuteScalar就直接對應的DotNet的值。

是以我們在查詢資料的結果的時候要注意直接用 dbresult==null 作為條件判斷是容易出問題的。

可以參考下前輩們的探索:

  1. http://blog.csdn.net/cmalaya/article/details/7222621
  2. http://www.cnblogs.com/chen-fan/articles/2171399.html

版權聲明:本文為CSDN部落客「weixin_33810302」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33810302/article/details/91965762