在网站上使用 Linq to SQL 时出现异常。已经有开放的数据阅读器

发布于 2024-12-03 08:40:42 字数 980 浏览 0 评论 0原文

在 ASP.NET 网站上,我使用 LINQ to SQL 来获取数据。此操作有点长(可能长达 3 秒),并且用户通常会第二次单击链接

已经有一个与此命令关联的打开的 DataReader 必须先关闭它。

我查看了 使用 LINQ 时 DataReader 已经打开 和其他类似的线程,但我确实这样做不明白如何处理/解决这个问题。

我应该完全摆脱 LINQ to SQL 吗?处理这个问题的正确方法是什么?

编辑:

我从Page_Load调用的代码

using (var wdc = new WebDataContext())
            {
                // Expensive operation, increase timeout
                wdc.CommandTimeout = 120;

                // First need to update data for this customer
                wdc.Web_WrkTrackShipment_Update((int)this.Parent.ProviderUserKey, sessionId);

                // Return set of this data based on parameters.
                return wdc.Web_WrkTrackShipment_Load(sessionId, pageNo, pageSize, searchCriteria, dateFrom, dateTo, ref pageCount_Null).ToList();
            } 

On a ASP.NET website I use LINQ to SQL to get data. This operation somewhat long (can be up to 3 seconds) and often user clicks on a link second time

There is already an open DataReader associated with this Command
which must be closed first.

I looked at DataReader already open when using LINQ and other similar threads but I do not understand how to handle/fix this.

Should I get rid of LINQ to SQL alltogether? What is a proper way to handle this?

EDIT:

Code that I call from Page_Load

using (var wdc = new WebDataContext())
            {
                // Expensive operation, increase timeout
                wdc.CommandTimeout = 120;

                // First need to update data for this customer
                wdc.Web_WrkTrackShipment_Update((int)this.Parent.ProviderUserKey, sessionId);

                // Return set of this data based on parameters.
                return wdc.Web_WrkTrackShipment_Load(sessionId, pageNo, pageSize, searchCriteria, dateFrom, dateTo, ref pageCount_Null).ToList();
            } 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

尬尬 2024-12-10 08:40:42

您可以通过设置多个活动结果集( MARS) 在连接字符串中设置为 true。请注意,这可能表明存在 N+1 连接问题,这实际上取决于查询。

string connectionString = "Data Source=MSSQL1;" + 
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
    "MultipleActiveResultSets=True";

You can fix this by setting Multiple Active Result Sets(MARS) to true in the connectionstring. Note that this might indicate a N+1 join problem, it really depends on the query.

string connectionString = "Data Source=MSSQL1;" + 
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
    "MultipleActiveResultSets=True";
〃安静 2024-12-10 08:40:42

我怀疑,根本原因是 DataContext 不是线程安全的。不同的请求在不同的线程上运行。

不要在线程之间共享 DataContext。可以在 BeginRequest 上启动一个并在 EndRequest 上关闭它 - 或者在需要时在本地创建一个,并将其包装在 using 语句中,以便在您的代码使用完它后立即将其释放。

I suspect, yhe underlying reason is DataContext not being thread-safe. Different requests run on different threads.

Don't share your DataContext between threads. Either start one on BeginRequest and close it on EndRequest - or create one locally whenever you need it, and wrap it in a using statement so it is immediately disposed when your code has finished using it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文