另一个“已经有一个开放的数据阅读器关联……”

本文关键字:关联 数据 有一个 另一个 | 更新日期: 2023-09-27 18:08:22

如何关闭DataReader ?我使用postgresql和MARS仅用于SQL。也许我不需要MARS来解决这个问题,我不知道。错误显示在foreach循环中。谢谢你的建议。

var months = (from month in connector.PositionInstance where month.FeeNoticeMonth >= DateTime.Now.Month select month);
foreach (PositionInstance p in months)
{
    System.Windows.MessageBox.Show("" + p.First().Position.Name);
}

编辑:我有两个表PositionInstance和Position:

CREATE TABLE "Position"
(
"PositionId" integer NOT NULL DEFAULT,
"Name" character varying(30) NOT NULL,
CONSTRAINT "PK_Position" PRIMARY KEY ("PositionId")
)
CREATE TABLE "PositionInstance"
(
"PositionInstanceId" integer NOT NULL DEFAULT,
"FeeNoticeYear" integer NOT NULL,
"FeeNoticeMonth" integer NOT NULL,
CONSTRAINT "PK_PositionInstance" PRIMARY KEY ("PositionInstanceId"),
CONSTRAINT "FK_Position_PositionInstance" FOREIGN KEY ("PositionId")
REFERENCES "Position" ("PositionId") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION 
)

另一个“已经有一个开放的数据阅读器关联……”

这个问题可能发生在您的情况下,由于延迟加载,这是发生在foreach循环内部。它试图在循环的每次迭代中从DB加载每个Position

解决这个问题的一种方法是使用急切加载在查询中一次获得所有Positions。然后,如果您在查询结束时还使用贪婪操作(如ToList()),则执行DB并一次取出所有内容。在您的情况下,尝试像

这样的内容
var months = 
    (from month in connector.PositionInstance 
     where month.FeeNoticeMonth >= DateTime.Now.Month 
     select month).Include("Position").ToList();

或其他变化。在查询后使用use ToList()将变量months类型为List(这是IEnumerable),其中包含从DB填充的结果;否则months将会是IQueryable,并且DB查询还没有执行。

尝试将此添加到连接字符串中:

MultipleActiveResultSets = True