c# Convert.IsDBNull

EF6框架,mysql數據庫,Model是imtesttable,其中有public Nullable<float> BW { get; set; };實驗之前通過mysql workbench可以看到要處理的某條記錄的BW值是NULL,當代碼中獲取到這條記錄時,對應的imt變量的BW值在調試窗口可以看到是null值。我有一個疑問的地方就是,

if (Convert.IsDBNull(imt.BW))判斷爲什麼不是true???????

另外,如果是:if (Convert.IsDBNull(imt.BW) || (imt.BW.Value == null))當BW爲空值時拋出異常。

實驗:

int? nval1 = null;
int? nval2 = 5;
Console.WriteLine(2 * nval1 ?? 0);
Console.WriteLine((2 * nval1) ?? 0);//nval1爲空,相乘還是null,輸出0
Console.WriteLine((2 * nval2) ?? 0);
Console.WriteLine(2 * nval2 ?? 0);
Console.WriteLine(nval1.HasValue);
Console.WriteLine(nval2.HasValue);
Console.WriteLine("------------------");
int? i = 0;

Console.WriteLine(i != null);
Console.WriteLine(i.HasValue);
int? t=null;

Console.WriteLine(t != null);
Console.WriteLine(t.HasValue);

0
0
10
10
False
True
------------------
True
True
False
False

所以代碼中換成:

                if (Convert.IsDBNull(imt.BW) || (!imt.BW.HasValue))
                    imt.BW = 1000f;

                if (Convert.IsDBNull(imt.BW2) || (imt.BW2  == null))

                    imt.BW2 = 1000f;

則當BW空值時可以正常賦值爲1000f.

 

如果從數據庫中 獲取一個記錄的string類型字段(msg)值,且數據庫中msg值還沒有賦值,也就是說imt.msg的值其實是null,那麼當:

if (Convert.IsDBNull(imt.msg))判斷時,返回值並不是true,而是false(msg字段類型不是DBNull)

當用 if (Convert.IsDBNull(imt.bak1) || (string.IsNullOrEmpty(imt.bak1)))則判斷返回的值是true

理解:

在C#中System.DBNull類型直接繼承自object,DBNull,它有一個:

public sealed class DBNull : ISerializable, IConvertible
    {
        // 摘要: 
        //     表示 System.DBNull 類的唯一實例。
        public static readonly DBNull Value;

。。。

}

所以DBNull不是int,不是float,也不是string......,但爲什麼DBNull可以表示數據庫中的int,float,string,DateTime等類型呢?
原因是.net存儲這些數據的類(DataRow等)都是以object的形式來存儲的,對於DataRow,它的row[rowindex]返回的值永遠不爲null,要麼就是具體的爲column的類型的值,要麼就是DBNull。DBNull實現了IConvertable,但是,除了ToString是正常的,其它的TOxxx都會拋出異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章