如何获取DataReader中列的序数

时间:2011-11-22 21:07:13

标签: ado.net sqldatareader datareader

如何确定DataReader的结果集中是否存在列?

我试试:

int columnOrdinal = reader.GetOrdinal("LastName");
columnExists = (columnOrdinal < 0);

但如果列不存在,则GetOrdinal会抛出异常。我的情况并不例外。情况正好相反。这...... ceptional。


注意:与我的问题无关,但真实的原因我想知道列是否存在是因为我想获得序数位置< / strong>列,如果列不存在则不抛出异常:

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;

注意:与我的问题无关但是,我想知道某列是否存在的真正原因是因为有时候结果集中不会出现列,而我不想抛出异常处理数据库的结果,因为它并不例外。

1 个答案:

答案 0 :(得分:3)

由于IDataReader没有暴露很多帮助,因此您可以执行的操作是有限制的。使用如类似问题的答案所示的循环

Check for column name in a SqlDataReader object

您可以使用您处理的第一行构建一个简单的字典,该字典由列名称键入,其中序号为值(如果您不关心序数值,则为HashSet)。然后你可以使用columnDictionary.ContainsKey(“LastName”)作为你的测试。你只会为遇到的第一行构建一次字典,然后所有后续行都会很快。

但说实话,与数据库时间相比,使用as-所消耗的时间是其他stackoverflow qeustion可能忽略不计的解决方案。

编辑:此处有其他可能性:Checking to see if a column exists in a data reader