查询表达式中的DBNull异常

时间:2015-02-18 14:53:14

标签: c# linq dbnull query-expressions

我有这个查询表达式,用于连接数据验证的一些值

result.AddRange(from string dr in ercDt
   select dc.Ordinal.ToString() + "|" + dr);

让ercDt [0]为DBNull,并且没有更多行,我收到此错误

  

无法将'System.DBNull'类型的对象强制转换为'System.String'。

我试过这个

result.AddRange(from string dr in ercDt
where dr.Any(x => x != null)
select dc.Ordinal + "|" + dr);

和这个

result.AddRange(from string dr in ercDt
where ercDt.Any(x => x != null)
select dc.Ordinal + "|" + dr);

和这个

result.AddRange(from string dr in ercDt
where !(dr is DBNull)
select dc.Ordinal + "|" + dr);

没有运气,

如何防止此错误发生?我需要根本不查询空值,所以在这种情况下我想要的输出将没有记录。

由于

修改

基于这种困惑,我会更好地描述我的情况:

'ercDt'是一个来自linq查询的列表(该linq查询的结果是字符串,非常罕见的DBNull情况)转换为List(使用ToList()方法),所以我可以将'dr'转换为字符串,但我的问题来自DBNull值

2 个答案:

答案 0 :(得分:0)

如果drDataRow无论如何都无效。您正在将DataRow转换为String,这会给您一个运行时错误。什么是ercDt(它是DataTable你甚至得到编译错误)?无论如何我都会尝试一下。

因此假设ercDtDataTable,我想你希望所有字段都有值,所以那些不是DBNull.Value。使用DataRow.IsNull

DataColumn dc = ercDt.Columns[0]; // i don't know which column you use
var fields = from dr in ercDt.AsEnumerable()
             where !dr.IsNull(dc.Ordinal)
             select dc.Ordinal + "|" + dr[dc].ToString();
result.AddRange(fields);

答案 1 :(得分:0)

我会这样做:

result.AddRange(from string dr in ercDt
select ((dc.Ordinal == null) ? string.Empty() : dc.Ordinal.ToString()) + 
    "|" + ((dr == null) ? string.Empty() : dr));