c# - 错误 : There is already an open DataReader associated with this Command which must be closed first

标签 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();
                            }
                         }
                     }
            }
 }

最佳答案

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 - 不过,这不是我的建议。

关于c# - 错误 : There is already an open DataReader associated with this Command which must be closed first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921821/

相关文章:

mysql - 带连接的 SQL 中的时差

MySql外键约束问题

c# - 将 #if DEBUG 与 Main 参数一起使用

c# - 使用 C# 自动字母数字唯一 ID

c# - 如何使 .net HttpClient 使用 http 2.0?

sql - 具有名称和最接近的富裕祖先的行

c# - 如何在ms-Chart中显示两级X轴

c# - 无法反序列化 WCF 代理类

C# 调用事件处理程序动态

c# - 使用 NetTCPBinding 进行回调