错误:已经有一个与此命令关联的打开DataReader,必须先关闭它

我正在使用sql连接来访问我的数据库中的不同表。 但是代码返回以下错误。

错误: “已经有一个与此命令关联的打开的DataReader必须先关闭”

MyContext conn = new MyContext() protected void ChangeName(int id) { User user = conn.MyOtherTable.First(x => x.id == id); var elements = conn.MyTable.Where(x => x.id == id && x.name == name).OrderBy(x => x.id).OrderBy(x => x.name). .Select(t => new { t.id, t.name, }).GroupBy(t => new { t.id, t.name, }); foreach (var item in elements) { foreach (var row in item) { for (int j = 1; j <= 5; j++) { if (row.name == "name") { user.name1 = row.name; conn.SaveChanges(); } if (row.name == "name2") { user.name2 = row.name; conn.SaveChanges(); } } } } } 

LINQ(与数据库通信时)通常是非缓冲的假脱机API。 要做你想做的事,要么:

  • 启用多个活动结果集(MARS)
  • 首先缓冲数据

我更喜欢第二种选择; 它只需要将.ToList()添加到第一行:

 var elements = conn.MyTable.Where(x => x.id == id && x.name == name) .OrderBy(x => x.id).OrderBy(x => x.name). .Select(t => new { t.id, t.name, }).GroupBy(t => new { t.id, t.name, }) .ToList(); 

现在这条线运行后,我们知道我们已经将所有数据都存储在内存中并且读取器已关闭; 以前它仍然可以从读者那里谈论行输入。

为了完整起见,这里讨论启用MARS – 但这不是我的建议。

我算了一个错误,但是我已经启用了多个活动结果集(MARS),最后我只是将ID(从)close()更改为dispose(),然后问题就消失了