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
并退出主题,其余的记录将无法显示。
我该如何处理?
答案 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
值。