0

只要我给出开始日期和结束日期的值,我的代码就可以正常工作。但是,当它们是空值时,它会返回格式异常。这就是我所做的:

public static string CheckInsertRecord(String EventType, String BeginDate, String EndDate) 
{
    NCDCPoint ncdc = new NCDCPoint();
    CEOSurveyDataContext CDC = new CEOSurveyDataContext();
    int et = Convert.ToInt32(EventType);
    CultureInfo provider = CultureInfo.InvariantCulture;
    DateTime b = Convert.ToDateTime(BeginDate);
    DateTime e = Convert.ToDateTime(EndDate);

    var query = (from n in CDC.NCDCPoints
                where n.EVENT_TYPE_ID == et && n.BeginDate == b && n.EndDate == e
                select new { 
                   n.EVENT_TYPE_ID,
                   BeginDate =  n.BeginDate.ToString("yyyy-MM-dd",provider),
                   EndDate = n.EndDate.ToString(),
                   n.BeginLATLONG,
                   n.EndLATLONG
                });
   if (query.Any())
   {
       return new JavaScriptSerializer().Serialize(query.ToList());
   }
   else
   {
       return "No duplicate";
   }
}

尝试并捕获没有用,因为我无法访问返回值。你能告诉我如何处理这个错误吗?

4

6 回答 6

2

您可以在尝试将字符串转换为 DateTimes 之前检查字符串是否为空

if (BeginDate == null || EndDate == null) {
    // handle it appropriately, perhaps by setting a default or returning
}

DateTime b = Convert.ToDateTime(BeginDate);
DateTime e = Convert.ToDateTime(EndDate);

如果可能,您还可以更改方法以接受 DateTime 值而不是字符串

于 2011-06-28T20:11:02.700 回答
2

DateTime不可为空。因此,尝试格式化 Null 或 Empty 的字符串应该返回异常。

public static string CheckInsertRecord(String eventType, String beginDate, String endDate)
{
    NCDCPoint ncdc = new NCDCPoint();
    CEOSurveyDataContext CDC = new CEOSurveyDataContext();
    int et = Convert.ToInt32(eventType);
    CultureInfo provider = CultureInfo.InvariantCulture;

    String queryBeingDate = string.Empty;
    String queryEndDate = string.Empty;
    DateTime beginDateTime;
    DateTime endDateTime;
    if (DateTime.TryParse(beginDate, out beginDateTime))
    {
       queryBeingDate = beginDateTime.ToString("yyyy-MM-dd");
    }

    if(DateTime.TryParse(endDate, out endDateTime))
    {
       queryEndDate = endDate;
    }

    var query = (from n in CDC.NCDCPoints
                 where n.EVENT_TYPE_ID == et && n.BeginDate == b && n.EndDate == e
                 select new
                 {
                     n.EVENT_TYPE_ID,
                     BeginDate = queryBeingDate,
                     EndDate = queryEndDate,
                     n.BeginLATLONG,
                     n.EndLATLONG
                 });
}
于 2011-06-28T20:24:42.203 回答
1

您从未说过您的字符串值是什么。它们的格式是否正确?

把你的try/catch例程像这样:

void test(string BeginDate, string EndDate) {
  DateTime noDate = new DateTime(1900, 1, 1);
  DateTime b;
  DateTime e;
  try {
    b = Convert.ToDateTime(BeginDate);
  } catch (Exception error) {
    b = noDate;
    MessageBox.Show("Invalid Format: " + BeginDate);
  }
  try {
    e = Convert.ToDateTime(EndDate);
  } catch (Exception error) {
    e = noDate;
    MessageBox.Show("Invalid Format: " + EndDate);
  }
  if (e < b) {
    throw new Exception("End Date can not be before Begin Date.");
  }
}
于 2011-06-28T20:15:14.093 回答
0

您可以将其更改DateTime为 Nullable,DateTime?或检查您传入的字符串string.IsNullOrEmpty()并添加您认为最适合处理 null 值的任何逻辑。

于 2011-06-28T20:13:07.517 回答
0

使用 DateTime.TryParse() 而不是 Convert.ToDateTime()。这永远不会引发异常并返回一个布尔值来告诉您转换是否有效。

于 2011-06-28T20:13:46.993 回答
0

代替

 DateTime b = Convert.ToDateTime(BeginDate);
    DateTime e = Convert.ToDateTime(EndDate);

 DateTime b, e;
  if(!DateTime.TryParse(BeginDate,out b))
      b = YOurDefaultBeginDate;
  if(!DateTime.TryParse(EndDate,out e))
      e = YOurDefaultEndDate;
于 2011-06-28T20:14:24.080 回答