我正在编写一个函数,该功能检查输出是否为 DBNull
并返回null,如果通用类型为nullable nullable。如果没有,它简单地丢弃了错误。
更新:添加了所有建议
public T Get<T>(string key)
{
int ordinal = reader.GetOrdinal(key);
if (reader.IsDBNull(ordinal))
{
if (typeof(T).GetTypeInfo().IsValueType && Nullable.GetUnderlyingType(typeof(T)) == null) // isn't a nullable field
throw new InvalidCastException();
else return default(T);
}
return reader.GetFieldValue<T>(ordinal);
}
但是,我不确定default(T)
是否返回每个可用字段的null。如果现在还有其他方法可以使其返回null吗?
是的,default(T)
是每个实际上是SomeType?
/ Nullable<SomeType>
的null
类似于CC_4的值,因此您应该使用的功能正常。
,您可能需要考虑string
和byte[]
之类的东西 - 这些也可以也来自数据库,可以是null。
您可能还想考虑如果某人只是犯错并在值为<decimal>
时要求<int>
的错误应该是什么。这将导致InvalidCastException
。IDataReader
上有一个IsDBNull()
方法比使用例外更合适。
最后:更喜欢throw;
而不是throw e;
在计算机资源方面,捕获和处理例外是一项极其昂贵的任务。您的方法将异常用作其逻辑流的一部分。这是查看您要解决的问题的一种不正确的方法。
此外,您正在捕获专门的InvalidCastException
例外。除了试图施加零参考以外,其他情况可能会发生这种例外。您正在隐藏/歪曲潜在的有效错误;这可能会花费您数小时令人沮丧,拔毛的调试。
以下应为您提供与原始方法相同的行为,但是在集成误差处理过程中没有放松堆栈的开销。
public T Get<T>(string key)
{
if(reader.IsDbNull(reader.GetOrdinal(key)))
{
//IF YOU SPECIFICALLY WANT TO THROW AN ERROR IF A VALUE TYPE
//if (typeof(T).IsValueType)
//{ throw new InvalidCastException(); }
return default(T);
}
return reader.GetFieldValue<T>(reader.GetOrdinal(key));
}