我正在使用SQLdatareader从数据库构建POCOs。代码可以正常工作,除非它在数据库中遇到空值。例如,如果数据库中的FirstName列包含空值,则会引发异常。
employee.FirstName = sqlreader.GetString(indexFirstName);在这种情况下,处理空值的最佳方法是什么?
发布于 2019-06-05 00:06:42
这里有很多有用的信息(和一些错误的信息)的答案,我想把它们放在一起。
这个问题的简短答案是检查DBNull -几乎每个人都同意这一点:)
泛型方法使我们可以用更少的代码来解决这个问题,而不是使用帮助器方法来读取每个SQL数据类型的可空值。但是,不能同时为可空值类型和引用类型使用单个泛型方法,这在Nullable type as a generic parameter possible?和C# generic type constraint for everything nullable中有详细讨论。
因此,根据@ZXX和@getpsyched的回答,我们最终得到了这两个方法,用于获取可空的值,我为非空值添加了第三个方法(它完成了基于方法命名的集合)。
public static T? GetNullableValueType<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? (T?)null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNullableReferenceType<T>(this SqlDataReader sqlDataReader, string columnName) where T : class
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.IsDBNull(columnOrdinal) ? null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}
public static T GetNonNullValue<T>(this SqlDataReader sqlDataReader, string columnName)
{
int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
return sqlDataReader.GetFieldValue<T>(columnOrdinal);
}我通常使用列名,如果您使用列索引,请更改列名。根据这些方法名称,我可以判断我是否期望数据为空,这在查看很久以前编写的代码时非常有用。
提示;
数据库中没有可为空的列的
最后,当我在所有SQL Server数据类型上测试上述方法时,我发现不能直接从SqlDataReader获取char[],如果需要char[],则必须获取字符串并使用ToCharArray()。
https://stackoverflow.com/questions/1772025
复制相似问题