NULL和DBNull的區別分析

測試準備:html

1.新建一個表sql

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.net

            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了.");
                     }
                }
            }
            #endregionserver

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

須要引發注意的是: ExecuteScalar的規則是,返回第一列,第一行的數據。假若有第一行,可是第一列爲空,那麼返回的是DBNull 。假如一行都沒有,那麼ExecuteScalar就返回null,假如第一列第一行不爲空,那麼ExecuteScalar就直接對應的DotNet的值。blog

因此咱們在查詢數據的結果的時候要注意直接用 dbresult==null 做爲條件判斷是容易出問題的。繼承

能夠參考下前輩們的探索:

  1. http://blog.csdn.net/cmalaya/article/details/7222621

  2. http://www.cnblogs.com/chen-fan/articles/2171399.html

相關文章
相關標籤/搜索