代码之家  ›  专栏  ›  技术社区  ›  Pierrick Martellière

mysql.data.mysqlclient.mysqlexception-已存在与此连接关联的打开的数据读取器,必须先关闭它

  •  0
  • Pierrick Martellière  · 技术社区  · 6 年前

    我是实体框架和asp.net-mvc 4的新手,我遇到了mysql.data异常,在google上找不到任何相关的线程。

    错误如下:

    已存在与此连接关联的打开的数据读取器,必须先关闭它。

    这是我的控制器的方法:

    // GET: api/Partenaires_prestations
    [Authorize]
    [Route("api/Partenaires_prestations")]
    public List<PartenaireMapItem> GetPartenairesWithPrestations()
    {
         Random rnd = new Random();
    
         var queryString = Request.GetQueryNameValuePairs();
    
         var prestation = queryString.FirstOrDefault();
    
         return db.Partenaires
             .Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
             .AsEnumerable()
             .Select(p => new PartenaireMapItem {
                 IdPartenaire = p.IdPartenaire,
                 FirstName = p.FirstName,
                 LastName = p.LastName,
                 NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
                 Type = p.Type,
                 DureeMin = 50,
                 Lat = p.Lat,
                 Lng = p.Lng,
                 ImageUrl = p.ImageUrl,
                 SeDeplace = p.SeDeplace,
                 ADomicile = p.ADomicile,
    
                 Notes = p.NoteClientPartenaires,
                 Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
             }).ToList();
    }
    

    感谢所有愿意花时间阅读/回答我帖子的人。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stefan    6 年前

    问题是,您正在同一个连接上同时运行多个查询。

    这是错误的结果。你可以选择允许它,或者修复它。

    让我们修复它(免责声明;这里有点猜测):

    在代码中,有两个查询正在连接上运行。您可以通过更改 AsEnumerable ToList

    db.Partenaires
             .Where(p => p.PartenairePrestations.Any(pp => pp.Prestation.NomPrestation == prestation.Value))
             //note: the change is here
             .ToList()
             .Select(p => new PartenaireMapItem {
                 IdPartenaire = p.IdPartenaire,
                 FirstName = p.FirstName,
                 LastName = p.LastName,
                 NomComplet = p.LastName.Substring(0,1).ToUpper() + ". " + p.FirstName,
                 Type = p.Type,
                 DureeMin = 50,
                 Lat = p.Lat,
                 Lng = p.Lng,
                 ImageUrl = p.ImageUrl,
                 SeDeplace = p.SeDeplace,
                 ADomicile = p.ADomicile,
    
                 Notes = p.NoteClientPartenaires,
                 Prestations = new List<string>(p.PartenairePrestations.Select(y => y.Prestation.NomPrestation))
             }).ToList();
    

    被劝告 , the 小精灵 将强制直接对数据库运行查询。这个 可枚举的 将取消执行,直到枚举为止。所以 托利斯特 将防止在此特定位置出现“打开数据读取器错误”。

    在枚举时,我猜您的代码会触发另一个查询,从而导致给定的错误。


    作为另一种选择,你可以放弃 可枚举的 因此将生成一个查询。但是请注意,在这种情况下,查询中使用的所有函数都必须转换为sql。


    这是一个相关的;关于一个数据读取器,它基本上是相同的:

    Exception: There is already an open DataReader associated with this Connection which must be closed first