c# - 处理 DateTime 的 DBNull 值

标签 c# datetime collections

我正在将我的 DataTable 转换为通用列表,并且当我将行值转换为列表的对象时,它给出了 Cast 异常。我尝试使用代码处理 DBNull

if (dataRow["DateCompleted"] == DBNull.Value)
{
    dataRow["DateCompleted"] = null;
}
if (dataRow["TotalRecords"] == DBNull.Value)
{
    dataRow["TotalRecords"] = 0;
}
if (dataRow["CompanyName"] == DBNull.Value)
{
    dataRow["CompanyName"] = "";
}

但 DateCompleted 不接受 null、DBNull 或空字符串。

在这个过程之后,我正在制作类似的对象

DemoData demoValue = new DemoData
{
    CompanyName = dataRow["CompanyName"].ToString(),
    DateCompleted = (DateTime)dataRow["DateCompleted"],
    TotalRecords = (int)dataRow["TotalRecords"]
};

并将对象添加到列表中

DataList.Add(demoValue);

我的 list 是

public List<DemoData> DataList = new List<DemoData>();

我的类(class)是

public class DemoData
{
    public string CompanyName { get; set; }
    public DateTime DateCompleted { get; set; }
    public int TotalRecords { get; set; }
}

最佳答案

如果 DemoData 完成,答案取决于您要执行的业务逻辑:

你可能想坚持使用null;然而,它使逻辑更加复杂(因为null 现在是一个特例),并且需要DemoData修改:

public class DemoData
{
     public string CompanyName { get; set; }
     // DateTime? - DateCompleted is Nullable<DateTime>   
     public DateTime? DateCompleted { get; set; }
     public int TotalRecords { get; set; }
}
...

DemoData demoValue = new DemoData {
  CompanyName = dataRow["CompanyName"].ToString(),
  DateCompleted = dataRow.IsDbNull("DateCompleted") 
    ? null // <- now we can assign null to Nullable<T>   
    : (DateTime?) dataRow["DateCompleted"],
  TotalRecords = (int)dataRow["TotalRecords"]
};

您可能希望采用以下(典型)逻辑:“如果 DemoData 尚未完成,则最终将在一个(遥远的) future ”:

...
if (dataRow["DateCompleted"] == DBNull.Value)
{
    // Well, at 31 Dec 9999 it'll be completed for sure...
    dataRow["DateCompleted"] = DateTime.MaxValue;
}

...

DemoData demoValue = new DemoData
{
  CompanyName = dataRow["CompanyName"].ToString(),
  DateCompleted = (DateTime)dataRow["DateCompleted"],
  TotalRecords = (int)dataRow["TotalRecords"]
};

关于c# - 处理 DateTime 的 DBNull 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44283916/

相关文章:

c# - ADO.NET 还是 Linq to SQL?

C# 泛型 : Passing List<string> to a method that expects a List<T>

c# - .NET 正则表达式替换单行匹配未知字符

t-sql - Sybase (T-SQL) 中 varchar 日期验证的最佳方法?

java - addAll() 实现——Java

list - ArrayList 的最大容量是多少?

c# - 根据实体类型覆盖 EF 6 中的默认 SQL 生成

javascript - 在 Javascript 中将日期时间字符串转换为单个时间单位(如秒)

java - 迭代开始日期和完成日期之间的所有周

collections - 你如何使用 Mongoose 创建一个有上限的集合?