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都會拋出異常。