【问题标题】:The source contains no DataRows源不包含 DataRows
【发布时间】:2015-04-04 04:09:42
【问题描述】:
DataTable dt = ds.Tables[4].AsEnumerable()
    .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date)
    .CopyToDataTable();

ds.Tables[4] 有行但会抛出异常

“源不包含 DataRows。”

知道如何处理或消除此异常吗?

【问题讨论】:

标签: c# linq datatable dataset


【解决方案1】:

ds.Tables[4] 可能,但您的 linq-query 的结果可能不会,这可能是引发异常的地方。拆分您的方法链接以使用临时参数,这样您就可以确定错误发生的位置。它还可以帮助您在调用 CopyToDataTable() 之前检查现有行并避免所说的异常。

类似

DataTable dt = null;
var rows = ds.Tables[4].AsEnumerable()
    .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date);

if (rows.Any())
    dt = rows.CopyToDataTable();

另一种选择是在DataTable 上使用ImportRow 函数

DataTable dt = ds.Tables[4].Clone();
var rows = ds.Tables[4].AsEnumerable()
    .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date);

foreach (var row in rows)
    dt.ImportRow(row);

【讨论】:

  • 它正在发生,因为没有记录匹配或完全填充查询条件并且结果为 null 所以这里我试图将 null 复制到数据表。
  • @Mike 就像我说的 - 拆分您的方法链并检查您的中间结果是一种方法。您问题上的 cmets 提出了另一个建议。
  • @Mike 我刚刚验证了这两种解决方案,并且都使用相当简化的数据模型。一定有其他事情发生。
【解决方案2】:

简单地分成两行

var rowSources = ds.Tables[4].AsEnumerable()
           .Where(x => ((DateTime)x["EndDate"]).Date >= DateTime.Now.Date);
if(rowSources.Any())
{
   DataTable dt = rowSources.CopyToDataTable();
   ... code that deals with the datatable object
}
else
{
   ... error message ?
}

这允许检查结果是否包含任何 DataRow,如果是,则可以调用 CopyToDataTable 方法。

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多