我有以下代码:
var entityConnection = (System.Data.EntityClient.EntityConnection)c.Connection;
DbConnection conn = entityConnection.StoreConnection;
ConnectionState initialState = conn.State;
List<Jobs> list = new List<Jobs>();
int id = 0;
try
{
if (initialState != ConnectionState.Open)
conn.Open();
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
reader = cmd.ExecuteReader();
int count = 0;
while (reader.Read())
{
id = int.Parse(reader[0].ToString());
list.Add(db.Jobs.Where(x => x.JobId == id).First());
//count++;
//if (count == 150) break;
reader.NextResult();
}
}
}
我得到一个错误说:“system.invalidoperationexception:读取器关闭时调用NextResult的无效尝试”
但事情是我没有关闭读者,但是当我删除这一行:
list.Add(db.Jobs.Where(x => x.JobId == id).First());
然后一切正常!但是这对我来说没用,因为我需要从阅读器填充一个列表对象,如果我不能这样做 - 那么我就无法读取该表了! (p.s我正在避免使用sqldatareader并使用dbdatareader,因为它与我联系使用实体框架进行上述调用)
答案 0 :(得分:6)
您需要移除对NextResult
的通话。此方法用于前进到下一个结果集,而不是下一个记录。你的while循环中的reader.Read()
就足够了
答案 1 :(得分:3)
您是否尝试删除此行
reader.NextResult();
while (reader.Read())
行应该可以用于读取数据。
这就是我们使用IDataReader的方式。
答案 2 :(得分:1)
你在While Reader.Read循环中调用NextResult - 这很令人困惑。如果'sql'返回的结果只是一组记录,那么NextResult将尝试查找要执行的一组SQL。如果您只想循环遍历一组记录,那么除了顶部的Reader.Read之外,您不需要任何其他内容。
仅当您的SQL包含多个语句时才需要NextResult,例如:
SELECT 1 AS ID;
SELECT 2 AS ID;
SELECT 3 AS ID
如果它只是一个基本的SELECT,它就无法运行。