错误:已经有一个与这个命令相关联的打开的数据读取器,必须先关闭它

本文关键字:读取 数据 有一个 错误 关联 命令 | 更新日期: 2023-09-27 18:08:19

我使用sql连接访问数据库中的不同表。然而,代码返回以下错误:

错误:"已经有一个与此命令相关联的打开的数据读取器必须先关闭":

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

now在这行运行之后,我们知道我们已经在内存中存储了所有的数据,并且读取器已经关闭;在此之前,它仍然可以与来自阅读器的行输入对话。

为了完整起见,这里讨论了启用MARS——但我不建议这样做。

我计数错误,因为你计数,但我已经启用了多个活动结果集(MARS),最后我只是改变IDateReader变量方法从close()处置(),然后问题消失