【问题标题】:Weird random exceptions奇怪的随机异常
【发布时间】:2012-09-27 08:57:55
【问题描述】:

ASP.NET MVC + LINQ exception相关

我在 8 到 12 次页面重新加载时随机出现 2 个异常 - 哪些异常也是随机的,可能是第一个,也可能是第二个。例外情况如下

[IndexOutOfRangeException: Index was outside the bounds of the array.]
       System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i) +701
       System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i) +29
       Read_BoardMessage(ObjectMaterializer`1 ) +348
       System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +42
       System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +472
       System.Linq.Enumerable.ToList(IEnumerable`1 source) +80
       Website.BusinessLogic.Services.BoardMessageService.GetBoardMessageModelsFromQuery(IQueryable`1 boardMessagesQuery) in D:\Applications\Website.BusinessLogic\Services\BoardMessageService.cs:167
       Website.BusinessLogic.Services.<>c__DisplayClass6.<GetStudentsBoardMessages>b__5() in D:\Applications\Website.BusinessLogic\Services\BoardMessageService.cs:89
       Library.Web.Utilities.RequestScopeCache.Get(String key, Func`1 defaultGetter) in D:\APPLICATIONS\Library\Web\Utilities\RequestScopeCache.cs:66
       Website.BusinessLogic.Services.BoardMessageService.GetStudentsBoardMessages(Int32 classId) in D:\Applications\Website.BusinessLogic\Services\BoardMessageService.cs:89
       Website.Web.usercontrols.ShowMessages.Initialize() in D:\Applications\Website.Web\usercontrols\ShowMessages.ascx.cs:28
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
       System.Web.UI.Control.LoadRecursive() +71
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Control.LoadRecursive() +190
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3064

----- 和 -----

[InvalidOperationException: Sequence contains more than one element]
   System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +4539
   System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +207
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +500
   System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +41
   System.Linq.Queryable.Count(IQueryable`1 source) +352
   Website.Web.usercontrols.TopMenu.SetStudentMenu() in D:\Applications\Website.Web\usercontrols\TopMenu.ascx.cs:93
   Website.Web.usercontrols.TopMenu.IsLoggedIn() in D:\Applications\Website.Web\usercontrols\TopMenu.ascx.cs:60
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
   System.Web.UI.Control.LoadRecursive() +71
  System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3064

堆栈跟踪指向以下代码

using (var dataContext = new MyDataContext(Config.ConnectionString))
{
   int numberOfBoardMessages = dataContext.BoardMessages.
                Where(boardMessage => boardMessage.BoardMessageClasses.
      Any(boardMessageClass => boardMessageClass.ClassId == currentClassId) && boardMessage.IsPublished).
                    Count();
}

我已尝试使用没有“BoardMessages”的空白数据库,但错误仍然存​​在。有人对可能是什么问题有任何想法吗?

【问题讨论】:

  • 很难看出您提供的行是如何引发这些异常的。 LINQ-to-SQL 通常会延迟执行 - 这是整个数据库操作,还是还有更多?
  • 只有它的代码,Count就爆炸了,真的很奇怪……
  • 您应该运行 SQL 探查器,或者如果这对您不可用,请使用 DataContext.Log 属性。
  • 好主意。从控制台应用程序运行您的程序并指定DataContext.Log = Console.Out
  • SQL Profiler 只给出正常的 sql 计数代码,与它工作时的代码相同。发生错误时,DataContext logger 不输出任何内容。

标签: c# asp.net linq linq-to-sql


【解决方案1】:

听起来有人需要使用TransactionScope

【讨论】:

  • 没有交易,只是简单的计数。
  • 不过,在一些 NO LOCK 脏插入的过程中可能会拾取数据,这可能会导致类似这两个问题。
  • 我会尝试实现它,但我确实觉得它令人难以置信,因为我是网站上唯一的用户,并且数据库中没有数据。
  • @JanJohansen 当然,您会觉得这令人难以置信,并且您自己对我的回答投了反对票,而不是在问题中提供您现在评论的信息。
  • 这是一个upvote,证明我没有给你downvote,我还在摆弄它,你会尽快得到一些反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多