if (!string.IsNullOrEmpty(rd.GetString(2)))
{
StrBcc = rd.GetString(2);
}
错误:System.Data.SqlTypes.SqlNullValueException:数据为空。无法在Null值上调用此方法或属性。
答案 0 :(得分:21)
我的解决方案是创建一个扩展方法:
static class DataReaderExtensions
{
public static string GetStringNullCheck(this IDataReader reader, int ordinal)
{
return reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal);
}
}
所以我可以用它作为:
StrBcc = rd.GetStringNullCheck(2);
答案 1 :(得分:11)
你应该使用
if (!rd.IsDbNull(2))
StrBcc = rd.GetString(2);
这是因为当您使用string.IsNullOrEmpty(x)
时,您告诉您的应用 x 是一个字符串,而数据库空值是与值为null的字符串不同。
答案 2 :(得分:1)
如果您的值可以 NULL ,那么使用 SqlTypes 可以是更安全的解决方案,因为它们都实现了可以使用:
StrBcc = rd.GetSqlString(2);
或者如果你喜欢扩展方法:
public static class DataReaderExtensions
{
public static T GetValueOrNull<T>(this SqlDataReader reader, int ordinal) where T : class
{
return !reader.IsDBNull(ordinal) ? reader.GetFieldValue<T>(ordinal) : null;
}
public static T? GetValueOrNullable<T>(this SqlDataReader reader, int ordinal) where T : struct
{
if (reader.IsDBNull(ordinal)) return null;
return reader.GetFieldValue<T>(ordinal);
}
}