2013-05-02 76 views
1

我已经写了一个Linq到Xml查询,从xml创建实体,我在xml中有一个DateTime字段,它可能是空白的,我需要将相同的空白分配给字段在实体中,我收到错误“String not recognized as DateTime”将空值赋给DateTime字段

XDocument xDocument = XDocument.Load(@“c:\ Sample.xml”);

 var _pndList = 
       from plist in 
        xDocument.Descendants("HEADER") 
       select new PND() 
       { 
        DeliveryDate = 
         DateTime.ParseExact(Convert(plist, "DELIVERYDATE"), "yyyyMMdd", 
              CultureInfo.InvariantCulture, DateTimeStyles.None), 
        LoadClosed = 
         DateTime.ParseExact(Convert(plist, "LOADCLOSEDDATETIME"), "yyyyMMddhhmmss", 
              CultureInfo.InvariantCulture, DateTimeStyles.None), 
        TrailerId = Convert(plist, "TRAILERID"), 
        TripAndRouteId = Convert(plist, "TRIPROUTEID"), 
        StoreCode = plist.Ancestors("STORE").Attributes().First().Value, 
        Product = 
         (from mlist in 
          plist.Ancestors("STORE").Descendants("RECORD") 
         select new PreNotifiedProduct() 
         { 
          DepotCode = Convert(plist, "DEPOTCODE"), 
          MU = Convert(mlist, "MU"), 
          CaseOrUnitQuantity = 
           System.Convert.ToInt32("0" + Convert(mlist, "NOOFCASES")), 
          OuterCaseHeight = 
           System.Convert.ToInt32("0" + 
                 Convert(mlist, "OUTERCASEHEIGHT")), 
          OuterCaseLength = 
           System.Convert.ToInt32("0" + 
                 Convert(mlist, "OUTERCASELENGTH")), 
          OuterCaseWidth = 
           System.Convert.ToInt32("0" + Convert(mlist, "OUTERCASEWIDTH")), 
          ProductCode = Convert(mlist, "TPNB"), 
          UnitsPerCase = 
           System.Convert.ToInt32("0" + Convert(mlist, "UNITSPERCASE")), 
          UseByDate = 
           DateTime.ParseExact(Convert(plist, "LOADCLOSEDDATETIME"), 
                "yyyyMMddhhmmss", 
                CultureInfo.InvariantCulture, 
                DateTimeStyles.None) 
         }).ToList() 
       }; 
    } 

在实体PreNotifiedProduct()UseByDate是日期时间

+1

我想你将不得不检查元素是否为空,如果为空,则可能将其设置为'DateTime.MinValue'(表兄弟姐妹'DateTime'没有什么空白,最接近的是使其成为可空类型并依赖null作为空值) – V4Vendetta 2013-05-02 12:18:24

回答

0

是否可以设置UseByDate类型的使其可以为空。

然后,您可能需要编写一些逻辑来测试它是否是有效的日期。也许写一个像这样的函数。

static DateTime? TestDate(string date) 
    { 
     DateTime result; 
     if (DateTime.TryParse("", out result)) 
     { 
      return result; 
     } 
     return null; 
    } 
0

DateTime不能为空或无效。您可以使用DateTime.MinValue(默认值)或将其更改为DateTime?,该值可以为空,然后可以设置为空。

如果存在字符串不可转换为DateTime的可能性,则还应该使用DateTime.TryParse。如果空值是唯一的例外,那么在尝试解析它之前可以检查它。

0

检查日期值是否为空, 如果是空白则不转换。

您可以使用三元运算符,以避免此类错误

1

尝试使用Nullable(T)DateTimeDateTime?DateTime.MinValue替代null当你不能。

如果您使用的是某种支持数据库的存储,我建议不要使用MinValue,因为您需要确保数据库类型的适当精度,以便它们匹配。

private static DateTime? TryParseDateTime(string dateTime) 
{ 
    DateTime result; 
    return DateTime.TryParseExact(dateTime, 
            "yyyyMMddhhmmss", 
            CultureInfo.InvariantCulture, 
            DateTimeStyles.None, 
            out result) 
      ? result 
      : null; 
} 

用法: “日期时间”

UseByDate = TryParseDateTime(Convert(plist, "LOADCLOSEDDATETIME"))