【问题标题】:Ignore null values in reader忽略阅读器中的空值
【发布时间】:2015-03-18 23:28:07
【问题描述】:

嗨,我如何在我的声明中忽略阅读器 c# 中的空值 =>

 LegalDesc = reader["legal1"].ToString() + ' ' + 
             reader["legal2"].ToString() + ' ' + 
             reader["legal3"].ToString();

场景:如果 legal2 为空值,则结果字符串将为

 legalDesc = legal1 + ' ' + legal3

如何在VB中使用iif?

【问题讨论】:

  • reader["legal2"] ?? " " 怎么样?
  • reader.IsDbNull 怎么样?
  • 你能改写我的剧本吗...谢谢
  • LegalDesc = (reader["legal1"] ?? "") + " " + (reader["legal2"] ?? "") + " " + (reader["legal3"] ? ?"");这就是 Soner 的意思。
  • 'string' 不是字符串文字的有效语法

标签: c# sqldatareader


【解决方案1】:

您可以使用集合和String.Join

List<string> legals = new List<string>();
if(!reader.IsDbNull(reader.GetOrdinal("legal1")))
    legals.Add(reader["legal1"].ToString());
if(!reader.IsDbNull(reader.GetOrdinal("legal2")))
    legals.Add(reader["legal2"].ToString());
if(!reader.IsDbNull(reader.GetOrdinal("legal3")))
    legals.Add(reader["legal3"].ToString());
LegalDesc = string.Join(" ", legals); 

当然你也可以使用自定义扩展方法让代码更优雅:

public static string SafeGetString(this SqlDataReader reader, int colIndex)
{
   if(!reader.IsDBNull(colIndex))
       return reader.GetString(colIndex);
   else 
       return string.Empty;
}

现在你可以使用了:

string[] legals = { reader.SafeGetString(0), reader.SafeGetString(1), reader.SafeGetString(2) };
LegalDesc = string.Join(" ", legals.Where(s => !string.IsNullOrEmpty(s))); 

这假定它实际上是一个 string 列,并且列序号位置是从 0 到 2。如果不是这种情况,请使用上面显示的 reader.GetOrdinal 方法来检测它们。

【讨论】:

  • 您可以使用 for 循环缩短代码。读者[“合法”+ i]
  • 我收到一个错误,因为 .isdbnull 在 VS 中以红色突出显示。数据来自调用类以加载到网格内的 excel 表...
  • @RezoMegrelidze:但是一旦 OP 更改列名或不想包含所有但只包含特定数字,这将失败。
  • @Jake:也许是因为你没有注意到我已经修复了一个错误。 reader.IsDbNull 采用 int 作为列的序号位置(因此是索引)。
  • 公共静态字符串 SafeGetString(this SqlDataReader reader, int colIndex) { if(!reader.IsDBNull(colIndex)) return reader.GetString(colIndex);否则返回字符串。空; }
【解决方案2】:

使用简单的扩展方法:

public static string ValueOrEmpty(this object source) 
{
     return source == null ? string.Empty : source.ToString();
}

var values = new[] { reader["legal1"],reader["legal2"],reader["legal3"] };
LegalDesc = string.Join(" ", 
                        values.Select(x => x.ValueOrEmpty())
                              .Where(x => x != string.Empty));

【讨论】:

    【解决方案3】:

    第一

    不要这样进行字符串连接,每次连接时,它都会创建一个新的字符串实例,因为字符串是Immutable。有一个处理追加的 C# 类,它是 StringBuilder

    所以尝试像这样实现它

    StringBuilder builder = new StringBuilder();
    builder.Append(reader["legal1"])
        .Append(" ")
        .Append(reader["legal2"])
        .Append(" ")
        .Append(reader["legal3"]);
    Console.WriteLine(builder.ToString());
    Console.ReadKey();
    

    这样,你甚至不需要检查它是否为空。

    【讨论】:

    • 真正的 stringbuilder 是要走的路,但如果你只打算连接三个字符串,那么改进是微不足道的,以至于在很多地方它可以被忽略。 stackoverflow.com/questions/73883/string-vs-stringbuilder
    • @Shekhar 也是如此,但这里的额外好处是删除了空检查。
    • 我不同意 StringBuilder 用于像这样的简短内容(string.Concat 更好),无论如何我们在这里谈论的是没有意义的微优化,但这并不能回答问题.
    【解决方案4】:

    您好,我只是想重新表述我的问题...

    如果 legal1 为 null,如何查看 LegalDesc = reader["legal1"].ToString() 的值?

    我正在网格中查看我的结果,因此网格在单元格中显示为 NULL。结果应该是一个空格而不是 NULL.... 在 VB 网络中,我可以使用 IIf 函数,如果为空,则为空格...

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 2018-06-25
      • 2011-04-19
      • 1970-01-01
      • 2020-03-30
      • 2017-07-25
      • 1970-01-01
      • 2013-06-20
      相关资源
      最近更新 更多