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

时间:2013-04-10 09:21:41

标签: c# asp.net sql

我正在使用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();
                            }
                         }
                     }
            }
 }

2 个答案:

答案 0 :(得分:6)

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();

现在此行已经运行后我们知道我们已经拥有内存中的所有数据并且阅读器已关闭;以前它可能仍在讨论读者的行输入。

为了完整性,enabling MARS is discussed here - 这不是我的建议。

答案 1 :(得分:0)

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