首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL数据读取器-处理空列值

SQL数据读取器-处理空列值
EN

Stack Overflow用户
提问于 2009-11-21 01:24:34
回答 30查看 429.6K关注 0票数 333

我正在使用SQLdatareader从数据库构建POCOs。代码可以正常工作,除非它在数据库中遇到空值。例如,如果数据库中的FirstName列包含空值,则会引发异常。

代码语言:javascript
运行
复制
employee.FirstName = sqlreader.GetString(indexFirstName);

在这种情况下,处理空值的最佳方法是什么?

EN

Stack Overflow用户

发布于 2019-06-05 00:06:42

这里有很多有用的信息(和一些错误的信息)的答案,我想把它们放在一起。

这个问题的简短答案是检查DBNull -几乎每个人都同意这一点:)

泛型方法使我们可以用更少的代码来解决这个问题,而不是使用帮助器方法来读取每个SQL数据类型的可空值。但是,不能同时为可空值类型和引用类型使用单个泛型方法,这在Nullable type as a generic parameter possible?C# generic type constraint for everything nullable中有详细讨论。

因此,根据@ZXX和@getpsyched的回答,我们最终得到了这两个方法,用于获取可空的值,我为非空值添加了第三个方法(它完成了基于方法命名的集合)。

代码语言:javascript
运行
复制
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);
}

我通常使用列名,如果您使用列索引,请更改列名。根据这些方法名称,我可以判断我是否期望数据为空,这在查看很久以前编写的代码时非常有用。

提示;

数据库中没有可为空的列的

  • 可避免此问题。如果您可以控制数据库,那么默认情况下,列应该是非空的,并且只有在必要时才可以为空。
  • 不要使用C# 'as‘操作符转换数据库值,因为如果转换错误,它将自动返回null。对于int、datetime、bit等值类型,使用default value expression
  • 会将数据库空值更改为非空值。

最后,当我在所有SQL Server数据类型上测试上述方法时,我发现不能直接从SqlDataReader获取char[],如果需要char[],则必须获取字符串并使用ToCharArray()。

票数 2
EN
查看全部 30 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1772025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档