我有一些C#代码可以动态生成SQL查询并通过IDbCommand.ExecuteScalar()执行它。这很好用;
中只有一个结果与我在DB中的查询匹配,结果总是返回。但就在最近,作为重构支持DB中多个匹配的第一步,我将ExecuteScalar()的调用替换为ExecuteReader()。设置和数据库访问中的其他所有内容都是相同的。但是返回的IDataReader不包含任何数据,每当我尝试从中获取数据时都会抛出InvalidOperationExceptions。
我知道数据仍在那里;当我切换回ExecuteScalar()时一切正常。这怎么可能?
答案 0 :(得分:1)
请确保在尝试访问ExecuteReader()
之前调用Read()上的IDataReader方法。调用Read()
会将读者推进到结果集的第一行(在您的情况下)。如果您在访问Read()
之前未致电IDataReader
,则在您尝试访问其数据时会收到InvalidOperationException
- 正如您所遇到的那样。
答案 1 :(得分:0)
这与在同一连接上打开多个IDataReaders有关吗?
因为您不会遇到ExecuteScalar()的问题,但是一旦开始使用ExecuteReader(),您需要确保同一连接上的所有先前DataReader都已关闭(例如,通过使用'using'块)
InvalidOperationException会出现什么错误消息?