【问题标题】:Error: There is already an open DataReader associated with this Command which must be closed first错误:已经有一个打开的 DataReader 与此命令关联,必须先关闭
【发布时间】:2013-04-10 09:21:40
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net sql


    【解决方案1】:

    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 - 不过我不建议这样做。

    【讨论】:

    • 你能解释一下为什么LINQ默认是一个非缓冲假脱机API吗?
    【解决方案2】:

    我算错了,但是我启用了多个活动结果集(MARS),最后我只是将 IDateReader 变量方法从 close() 更改为 dispose() ,然后问题就消失了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多