如何防止异常null值使用Oledb检索记录

本文关键字:Oledb 检索 记录 何防止 异常 null | 更新日期: 2023-09-27 18:00:23

    while(r.Read())
    {
      ListViewItem item = new ListViewItem(r.GetString(2));
      item.SubItems.Add(r.GetString(3));
      item.SubItems.Add(r.GetString(4));
      item.SubItems.Add(r.GetString(5));
      item.SubItems.Add(r.GetString(6));
      item.SubItems.Add(r.GetString(7));
      item.SubItems.Add(r.GetString(8));
      item.SubItems.Add(r.GetString(11));
      lsvListOfBooks.Items.Add(item);
    }

这段代码用记录填充列表视图。但是如果来自数据库的单元格为空,它抛出异常

Specified cast is not valid

并退出线程,其余记录将不会显示。

我该怎么处理?

如何防止异常null值使用Oledb检索记录

问题是,结果列中的null值由不同的类型表示,确切地说是DBNull,并且不能简单地转换为string

对此,最简单的解决方案是为IDataReader接口创建一个扩展,该扩展将检测DBNull值并对其进行转换。将此类添加到您的代码中:

public static partial class Extensions
{
    public static string GetNullableString(this IDataReader self, int ordinal)
    {
        return self.IsDBNull(ordinal) ? null : self.GetString(ordinal);
    }
}

现在,您可以在代码中用GetNullableString替换GetString,它应该按预期工作。IsDBNull调用将检测到null条件并返回null,而不是抛出错误。

不幸的是,所有的数据类型都需要这种东西。如果空值对字段有效,则IDataReader将使用与任何可为空类型都不兼容的DBNull值。