忽略 reader 中的空值
Ignore null values in reader
嗨,我如何在我的语句中忽略 reader c# 中的空值 =>
LegalDesc = reader["legal1"].ToString() + ' ' +
reader["legal2"].ToString() + ' ' +
reader["legal3"].ToString();
场景:如果 legal2 是空值,则结果字符串将为
legalDesc = legal1 + ' ' + legal3
如何应用 iif 在 VB 中使用?
您可以使用集合 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
方法来检测它们。
使用简单的扩展方法:
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));
第一个
不要 那样进行字符串连接,每次连接时都会创建一个新的字符串实例,因为字符串是 Immutable
。有一个 C# class 处理追加,它是 StringBuilder
所以尝试像这样实现它
StringBuilder builder = new StringBuilder();
builder.Append(reader["legal1"])
.Append(" ")
.Append(reader["legal2"])
.Append(" ")
.Append(reader["legal3"]);
Console.WriteLine(builder.ToString());
Console.ReadKey();
这样,你甚至不需要检查它是否为空。
嗨,我只是想重新表述一下我的问题...
如果 legal1 为空,如何查看 LegalDesc = reader["legal1"].ToString() 的值?
我在网格中查看我的结果,因此网格在单元格中显示 NULL。结果应该是空白 space 而不是 NULL....
在 VB net 中我可以使用 IIf 函数 if null then blank space...
嗨,我如何在我的语句中忽略 reader c# 中的空值 =>
LegalDesc = reader["legal1"].ToString() + ' ' +
reader["legal2"].ToString() + ' ' +
reader["legal3"].ToString();
场景:如果 legal2 是空值,则结果字符串将为
legalDesc = legal1 + ' ' + legal3
如何应用 iif 在 VB 中使用?
您可以使用集合 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
方法来检测它们。
使用简单的扩展方法:
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));
第一个
不要 那样进行字符串连接,每次连接时都会创建一个新的字符串实例,因为字符串是 Immutable
。有一个 C# class 处理追加,它是 StringBuilder
所以尝试像这样实现它
StringBuilder builder = new StringBuilder();
builder.Append(reader["legal1"])
.Append(" ")
.Append(reader["legal2"])
.Append(" ")
.Append(reader["legal3"]);
Console.WriteLine(builder.ToString());
Console.ReadKey();
这样,你甚至不需要检查它是否为空。
嗨,我只是想重新表述一下我的问题...
如果 legal1 为空,如何查看 LegalDesc = reader["legal1"].ToString() 的值?
我在网格中查看我的结果,因此网格在单元格中显示 NULL。结果应该是空白 space 而不是 NULL.... 在 VB net 中我可以使用 IIf 函数 if null then blank space...