2014-03-27 27 views
1

我有一個TextBox控件擁有一個日期,通常可能是null。我在插入使用它,當我嘗試插入我收到錯誤消息:在C#中傳遞Asp.Net控件的DateTime的Null值

String was not recognized as a valid DateTime.

我不確定如何將空值作爲一個日期時間。這是我的代碼。

這是Convert.ToDateTime(txtDateAction.Text),我有問題。

protected void btnLog_Click(object sender, EventArgs e) 
    { 

      PhoneLogsBLL.InsertOCASPhoneCall(
      Convert.ToInt16(txtStaffID.Text), 
      Convert.ToDateTime(txtDate.Text),     
      chkAdvisoryBoard.Checked, 
      chkClaims.Checked, 
      chkDR.Checked, 
      chkEEOICPA.Checked, 
      chkOCAS.Checked, 
      chkPhysicianPanel.Checked, 
      chkPC.Checked, 
      chkWebsite.Checked, 
      chkSEC.Checked, 
      chkCATI.Checked, 
      chkNIOSH800.Checked, 
      chkORAU800.Checked, 
      chkCongressional.Checked, 
      chkCOI.Checked, 
      chkDOLOutreach.Checked, 
      txtDiscussion.Text, 
      chkActionRequired.Checked, 
      Convert.ToDateTime(txtDateAction.Text), 
      txtAction.Text, 
      0, 
      chkActivityReport.Checked); 
    } 

public static void InsertOCASPhoneCall(
     short sintStaffID, 
     DateTime dtmDateCalled, 
     bool blnAB, 
     bool blnClaims, 
     bool blnDR, 
     bool blnEEOICPA, 
     bool blnOCAS, 
     bool blnPhysicianPanel, 
     bool blnPC, 
     bool blnWebSite, 
     bool blnSEC, 
     bool blnCATI, 
     bool blnNIOSH800, 
     bool blnORAU800, 
     bool blnCC, 
     bool blnCOI, 
     bool blnDOL, 
     string vcharDiscussion, 
     bool blnActionNeeded, 
     DateTime dtmActionTaken, 
     string ActionTaken, 
     short sintActionTakenStaffID,    
     bool blnActivityReport) 
    { 
     UnitOfWorkCTS uow = new UnitOfWorkCTS(); 

     using (var repo = new OCASPhoneCallsRepository(uow)) 
     { 
      OCASPhoneCalls call = new OCASPhoneCalls(); 

      call.dtmDateCalled = dtmDateCalled; 
      call.sintStaffID = sintStaffID; 
      call.blnAB = blnAB; 
      call.blnClaims = blnClaims; 
      call.blnDR = blnDR; 
      call.blnEEOICPA = blnEEOICPA; 
      call.blnOCAS = blnOCAS; 
      call.blnPhysicianPanel = blnPhysicianPanel; 
      call.blnPC = blnPC; 
      call.blnWebSite = blnWebSite; 
      call.blnSEC = blnSEC; 
      call.blnCATI = blnCATI; 
      call.blnNIOSH800 = blnNIOSH800; 
      call.blnORAU800 = blnORAU800; 
      call.blnCC = blnCC; 
      call.blnCOI = blnCOI; 
      call.blnDOL = blnDOL; 
      call.vcharDiscussion = vcharDiscussion; 
      call.blnActionNeeded = blnActionNeeded; 
      call.dtmActionTaken = dtmActionTaken; 
      call.sintActionTakenStaffID = sintActionTakenStaffID; 
      call.blnActivityReport = blnActivityReport; 

      repo.InsertOrUpdate(call); 
      uow.Save(); 

     } 
    } 
+2

http://stackoverflow.com/questions/8839787/nullable-日期時間可能會幫助你。 – rach

回答

5

你的財產應該被標記爲

DateTime? dtmActionTaken, 

你應該檢查textbox它具有文本第一:

string.IsNullOrEmpty(txtDateAction.Text) ? (DateTime?)null : Convert.ToDateTime(txtDateAction.Text), 

你也應該被測試以下情形:如果textbox具有文本但不是有效日期,

+0

關於這部分null:Convert.ToDateTime(txtDateAction.Text)我收到一條錯誤消息無法確定條件表達式的類型,因爲''和'System.DateTime'之間沒有隱式轉換 – hollyquinn

+1

您需要將null:'(DateTime?)null'或'default(DateTime?)' –

+0

@hollyquinn我已經根據Hans Kesting的建議更新了答案。 – Seany84

0

DateTime是一個結構體,因此您不能直接將它設置爲null。嘗試在應用轉換器之前寫入一個檢查值爲空或空的值。

+1

那麼'Nullable '也是一個結構體,但是你可以將它設置爲null ......問題在於'DateTime'是一個*不可爲空的值類型。 –

0

我可能會這樣做:

  1. 更改InsertOCASPhoneCall方法簽名,使得dtmActionTaken參數是DateTime?(或Nullable<DateTime>,二者是等效—第一個是語法糖)。

  2. 然後,使用string.IsNullOrEmpty(txtDateAction.Text)? null:Convert.ToDateTime(txtDateAction.Text):null。

+0

是不是這正是我以前寫的東西:http://stackoverflow.com/a/22689567/550198 – Seany84

+0

我得到同樣的錯誤,因爲我與Seany84的代碼。 – hollyquinn

+2

@ Seany84是的,但我已經在寫我的答案並貼出來了。 – fourpastmidnight

0

我可以建議添加一個錯誤捕獲,如果文本值爲空設置日期爲今天的日期?因爲在常識中沒有'null'日期值(類似於#12:00:00 AM#)。沿(在VB.net)行

東西:

If Textbox1.Text = "" then 
    Textbox1.Text = Date.Now 
Else 
    CDate (Textbox1.Text) 
End if 

而在C#中:

if (string.IsNullOrEmpty(Textbox1.Text)) { Textbox1.Text = System.DateTime.Now; } else { Convert.ToDateTime(Textbox1.Text); } 
0

既然你傳遞一個DateTime到InsertOCASPhoneCall,而不是空的,一根絕假定它是必需的。因此,你應該把if語句調用InsertOCASPhoneCall周圍,以確保它有一個有效值:

DateTime dtmActionTaken; 
if (DateTime.Parse(txtDateAction.Text, out dtmActionTaken) == false) 
{ 
    // notify the user of the invalid date 
} 
else 
    PhoneLogsBLL.InsertOCASPhoneCall(
     Convert.ToInt16(txtStaffID.Text), ... 
     ...dtmActionTaken 

如果數據庫確實可以處理NULL的ActionTaken列,那麼你就可以代替改變dtmActionTaken InsertOCASPhoneCall到DateTime的參數? dtmActionTaken,並在不解析時傳入null。喜歡的東西:

DateTime dtmActionTaken; 
DateTime? dtmActionTakenParm = null; 

if (DateTime.Parse(txtDateAction.Text, out dtmActionTaken) == false) 
{ 
    dtmActionTakenParm = dtmActionTaken; 
} 

PhoneLogsBLL.InsertOCASPhoneCall(
     Convert.ToInt16(txtStaffID.Text), ... 
     ...dtmActionTakenParm 

雖然仍可能需要通知用戶,如果它不解析(而不是作爲一個空字符串)