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

时间:2014-04-28 01:24:42

标签: c# listview dbnull

    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);
    }

此代码用记录填充列表视图。 但如果数据库中的单元格为null, 它抛出异常

Specified cast is not valid

并退出主题,其余的记录将无法显示。

我该如何处理?

1 个答案:

答案 0 :(得分:0)

问题是结果列中的空值由不同的类型表示 - 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);
    }
}

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

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