我怎样才能发现如果列存在于DataReader的结果集中?
我试一试:
int columnOrdinal = reader.GetOrdinal("LastName");
columnExists = (columnOrdinal < 0);
但是GetOrdinal
如果列不存在则抛出异常。我的情况并不例外。事实恰恰相反。这是……ceptional。
注意:与我的问题无关,但是,真正的原因我想知道一列是否存在是因为我想获得一列的序数位置,如果列不存在则不会抛出异常:
int columnOrdinal = reader.GetOrdinal("Lastname");
注意:与我的问题无关,但是,真实原因我想知道是否存在一列,因为我想知道该列是否包含null:
itIsNull = reader.IsDBNull(reader.GetOrdinal("Lastname"));
不幸的是,IsDBNull
只接受一个序数,而GetOrdinal
抛出一个异常。所以我只剩下:
if (ColumnExists(reader, "Lastname"))
{
itIsNull = reader.IsDBNull(reader.GetOrdinal("Lastname"));
}
else
itIsNull = false;
注意:与我的问题无关,但是,我想知道列是否存在的真正原因是因为有时列不会出现在结果集中,并且我不想抛出异常处理数据库结果,因为它不是异常。
您所能做的是有限的,因为IDataReader并没有公开多少有用的东西。使用类似问题
的答案所示的循环检查SqlDataReader对象中的列名
对于处理的第一行,您可以构建一个简单的字典,该字典以列名为键,以序数作为值(或者如果不关心序数值,则使用HashSet)。然后,您可以使用columnDictionary.ContainsKey("LastName")作为测试。您只需为遇到的第一行构建一次字典,然后所有随后的行都将很快。
但说实话,与数据库时间相比,在其他stackoverflow问题中使用as-is解决方案所消耗的时间可能可以忽略不计。
编辑:这里有更多的可能性:检查一个列是否存在于数据阅读器