【问题标题】:How do i get the ordinal of a column in a DataReader如何获取 DataReader 中列的序号
【发布时间】:2011-11-22 21:07:12
【问题描述】:

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

我试试:

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

但是如果列不存在,GetOrdinal 会抛出异常。我的情况也不例外。恰恰相反。这是……非凡的。


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

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;

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

【问题讨论】:

  • NotRelatedToMyQuestionException
  • @hatchet 这当然不是我要对数据集的每一行调用的技术
  • @TomasVoracek 我正在尝试避免异常,在这里你抛出更多!
  • 如果您阅读了上面链接的 stackoverflow 问题中的其他答案,您会看到 GetSchemaTable 可能包含实际数据读取器中不存在的列。

标签: ado.net sqldatareader datareader


【解决方案1】:

由于 IDataReader 没有提供太多帮助,因此您可以做的事情是有限的。使用类似问题的答案中所示的循环

Check for column name in a SqlDataReader object

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

但老实说,与数据库时间相比,在其他 stackoverflow 问题中使用 as-is 解决方案所消耗的时间可能可以忽略不计。

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

【讨论】:

  • 问题是代码对IDataReader中的每一行执行一次。每次迭代可能会丢失四个列,以及 40,000 次迭代,那就是 80,000 个异常(而不是零)。答案似乎是“你不能那样做”。我会将“有一个限制...” 改成“无法完成”,并称其为已接受。 +1 一些可能在其他情况下帮助其他人的解决方法,但我的问题已得到解答。
  • 使用我链接到的问题的最佳答案中的方法将避免所有异常。是的,循环会执行很多次,但总成本可能不会太多,而且它会比捕获异常更干净、更好看。
猜你喜欢
  • 1970-01-01
  • 2020-02-24
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多