2015-11-11 57 views
0

我在使用「Date」屬性時遇到了問題。 我在這裏的類:不能在while循環中比較兩個日期

public bool ChuyenDSChamCong() 
{ 
    try 
    { 
     DataTable dta = DSChamCong(); 
     if (dta == null) 
      return false; 
     foreach (DataRow r in dta.Rows) 
     { 
      try 
      { 
       string sql = "delete FROM tk_dlchamcong where MD5(CONCAT(ma_chamcong,ma_nv, tg_check)) = md5('" + r["CardID"] + r["StaffID"] + r["TransDT"].ToString() + "')"; 
       MYSQLDB.query(sql); 
       while (((DateTime)r["TransDT"]).Date == (DateTime.Today).Date) 
       { 
        string sql1 = "INSERT INTO tk_dlchamcong(ID,ma_chamcong, ma_nv, tg_check)values(md5('" + r["CardID"] + r["StaffID"] + r["TransDT"].ToString() + "'),'" + r["CardID"] + "', '" + r["StaffID"] + "', '" + r["TransDT"] + "')"; 
        MYSQLDB.query(sql1); 
       } 
      } 
      catch { 
      } 
     } 
     return true; 
    } 
    catch { } 
    return false; 
} 

我不能使用日期()屬性,它只有日期接受。但是,當我調試它顯示這樣並跳到捕捉錯誤。它不能比較,r["TransDT"]DateTime。這裏是圖片顯示錯誤。

enter image description here

更新:R 「TransDT」]是目的{字符串}在數據庫中有值:11/11/2015 18:03:11

我格式這與像查詢: FORMAT(TransDT,'dd/MM/yyyy HH:mm:ss') as TransDT from Transact

錯誤時調試:

Animate screenshot gif

+2

很明顯,r [「TransDT」]不是DateTime類型,你能驗證它實際是什麼類型嗎? 'Debug.WriteLine(r [「TransDT」]。GetType()。FullName);'(假設它不能爲null) –

+0

@ LasseV.Karlsen DateTime雖然可以爲空,但據我所知。因此,如果我沒有弄錯,那麼如果爲空,它應該是DBNULL? – Thomas

+1

另外,你真的**鑼插行直到第二天?你的while循環不會推進'r',你會一遍又一遍地做同樣的事情,直到發生改變的一件事變得足夠了,那就是'DateTime.Today'。另外,'DateTime.Today'已經是日期,你也不需要'.Date'。 –

回答

0

值可能是nullDBNull.Value),您可以嘗試使用as-operator將其轉換爲DateTime?。如果轉換失敗,你得到Nullable<DateTime>HasValue=false

DateTime? TransDT = r["TransDT"] as DateTime?; 
if(TransDT.HasValue && TransDT.Value.Date == DateTime.Today) 
{ 
    // ... 
} 

你並不需要一個while,一個if就足夠了,因爲你有一個DataRow

+1

你也可以這樣做:'if(TransDT == DateTime.Today)' –

+0

@ LasseV.Karlsen:對,我只是想更清楚'DateTime?'是什麼,它有一個'HasValue'和'Value財產。否則,爲什麼我在這裏使用它並不那麼清楚。 –

+0

@TimSchmelter,我試過這段代碼。但是'TransDT'值始終爲空。 –