簡體   English   中英

C#Object null檢查

[英]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 ,那么分配你喜歡的任何值。

在這種情況下,我喜歡使用引用類型(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM