当IDbCommand.ExecuteScalar()成功时,为什么IDbCommand.ExecuteReader()会失败?

时间:2009-08-19 22:05:48

标签: c# sql tsql

我有一些C#代码可以动态生成SQL查询并通过IDbCommand.ExecuteScalar()执行它。这很好用;

中只有一个结果与我在DB中的查询匹配,结果总是返回。

但就在最近,作为重构支持DB中多个匹配的第一步,我将ExecuteScalar()的调用替换为ExecuteReader()。设置和数据库访问中的其他所有内容都是相同的。但是返回的IDataReader不包含任何数据,每当我尝试从中获取数据时都会抛出InvalidOperationExceptions。

我知道数据仍在那里;当我切换回ExecuteScalar()时一切正常。这怎么可能?

2 个答案:

答案 0 :(得分:1)

请确保在尝试访问ExecuteReader()之前调用Read()上的IDataReader方法。调用Read()会将读者推进到结果集的第一行(在您的情况下)。如果您在访问Read()之前未致电IDataReader,则在您尝试访问其数据时会收到InvalidOperationException - 正如您所遇到的那样。

答案 1 :(得分:0)

这与在同一连接上打开多个IDataReaders有关吗?

因为您不会遇到ExecuteScalar()的问题,但是一旦开始使用ExecuteReader(),您需要确保同一连接上的所有先前DataReader都已关闭(例如,通过使用'using'块)

InvalidOperationException会出现什么错误消息?