[英]C# Object null check
我使用DataReader讀取了我的數據庫。
並且某些行沒有fdate值。
因此,當我將null日期轉換為DateTime時,會發生錯誤。
如何查看該字段是否為空?
AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = "select name,fdate from abc";
AdsDataReader reader = cmd.ExecuteReader();
DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today;
我嘗試使用Equals,但它不起作用。
有誰知道如何檢查null對象以避免轉換錯誤?
謝謝!
當大家指出如何解決問題時,我試圖向您提供有關NULL和DBNull之間區別的信息。
null
和DBNull是不同的。
null
不是任何類型的實例。 DBNull是一個包含一個實例的單例類: DBNull.Value
。
null
表示無效引用,其中DBNull.Value
表示DB中不存在的值。
DBNull.Value
是數據庫提供程序為表中的不存在的值提供的內容。
使用該背景(reader["fdate"].Equals(null))
在這里使用是不正確的。 你必須用DBNull.Value
檢查它。 如果它是DBNull
類型,或者它等於DBNull.Value
,那么分配你喜歡的任何值。
使用DbNull:
在這種情況下,我喜歡使用引用類型(varchar的字符串)或Nullable包裝的值類型(DateTime?)來表示可空的數據庫列。 這樣,您可以更准確地表示程序中的數據庫架構。
這也允許您使用以下格式更清晰地編寫轉換邏輯:
DateTime? fdate = datareader["fdate"] as DateTime?;
如果datareader結果是DbNull並且fdate將設置為默認值(DateTime?),則該轉換將失敗,該值為null。 此時,您可以通過檢查可空類型是否具有值(fdate.HasValue)來獲取您想要的實際值,如果不是,則使用您的默認值 - DateTime.Today。
DateTime flsdate = reader["fdate"].Equals(DBNull.Value)
? Convert.ToDateTime(reader["fdate"])
: DateTime.Today;
但是將日期默認為Today
似乎很危險。 我會這樣做:
DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
? Convert.ToDateTime(reader["fdate"])
: (DateTime?)null;
此外,如果fdate
列的底層tpe已經是DateTime,請不要使用System.Convert:
DateTime? flsdate = reader["fdate"].Equals(DBNull.Value)
? (DateTime?)reader["fdate"])
: null;
請嘗試以下方法:
DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value
? DateTime.ParseExact(reader["fdate"])
: DateTime.Today;
DateTime flsdate = DateTime.Today;
if(reader["fdate"] != null)
flsdate = Convert.ToDateTime(reader["fdate"])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.