在我的ASP.NET MVC / AJAX站点上导致这些SQL转换错误的原因是什么? [视频显示问题]

时间:2010-02-16 13:41:14

标签: c# sql asp.net-mvc ajax linq

我很沮丧......我的网站突然变得非常不稳定。这么多,一遍又一遍地刷新将导致它崩溃。为了调查,我关闭了所有错误处理,所以我可以看到一些YSOD。

我没有尝试全部写出来,而是制作了一个显示问题的视频。 You can see it here on YouTube

这是stacktrace的副本:

[InvalidCastException: Specified cast is not valid.]
   System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) +847
   System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) +113
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +344
   System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +23
   System.Linq.Queryable.Count(IQueryable`1 source) +240
   MvcPaging.PagedList`1.Initialize(IQueryable`1 source, Int32 index, Int32 pageSize, Nullable`1 totalCount) in C:\Users\BikGame\Desktop\src\MvcPaging\PagedList.cs:63
   MvcPaging.PagedList`1..ctor(IQueryable`1 source, Int32 index, Int32 pageSize, Nullable`1 totalCount) in C:\Users\BikGame\Desktop\src\MvcPaging\PagedList.cs:25
   MvcPaging.PagedList`1..ctor(IQueryable`1 source, Int32 index, Int32 pageSize) in C:\Users\BikGame\Desktop\src\MvcPaging\PagedList.cs:19
   MvcPaging.PagingExtensions.ToPagedList(IQueryable`1 source, Int32 pageIndex, Int32 pageSize) in C:\Users\BikGame\Desktop\src\MvcPaging\PagingExtensions.cs:63
   ApoAds.Controllers.HomeController.Index() in C:\Users\BikGame\Documents\Visual Studio 2008\Projects\APOAds-MultiBaseBiz\Controllers\HomeController.cs:22
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +39
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +53
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +258
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +20
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +258
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +20
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +193
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +382
   System.Web.Mvc.Controller.ExecuteCore() +123
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +23
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +144
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +54
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

在尝试加载的页面上,有两个对视图的ajax调用,这些视图命中数据库,渲染表并返回html。站点顶部菜单的部分从数据库中提取,然后缓存以防止多次返回。托管在IIS6中的中等信任,共享环境中。

疯狂如何工作,然后停止工作3-4分钟,然后再次工作......也许一个SQL连接挂起,然后在几分钟后超时?

非常感谢任何想法!提前谢谢!

更新:添加了数据访问代码

我在存储库模式中使用LINQ to SQL。这是一个AJAX调用正在使用的查询。

public IQueryable<Ad> FindAdsPerBase(string baseName, AdStatus status)
{
    return (from ad in _db.Ads
            join b in _db.AdBases on ad.AdID equals b.AdID
            where b.MilBase.BaseName.ToLower() == baseName.ToLower() && ad.Status == (byte)status
            select ad).Distinct().OrderByDescending(x => x.DateEntered);
}

并在控制器中调用它,如下所示:

var ads = _db.FindAdsPerBase(MilBase, AdStatus.Active).Take(11);

2 个答案:

答案 0 :(得分:3)

您可能已经更改了数据库中的某些内容(如列的数据类型),而不记得重新创建LINQ类。因此,LINQ to SQL可能会导致该转换异常。

答案 1 :(得分:3)

你没有提供足够的信息来排除故障,并且(没有冒犯)我没有前往YouTube观看视频。以下是我要采取的一些常规故障排除步骤以及我自问的问题:

  1. 当它失败时,是否总是完全相同的异常?或者它有变化吗?如果总是抛出相同的异常,那么你的逻辑中可能存在缺陷。如果你得到完全随机的例外,那么你可能会遇到硬件或基础设施问题。

  2. 当您获得LINQ to SQL异常时要做的第一件事就是连接 SQL Profiler 以查看发送到服务器的确切查询语句。将其复制/粘贴到SQL Management Studio中并手动运行。查看结果并将它们与您正在加载的对象的数据类型进行比较:是否将空值映射到不可为空的字段?也许查询列被映射到不同类型的属性?

  3. 如果它工作3-4分钟,然后停止3-4分钟,然后再次工作,在项目中查找任何特定于时间的代码。你在做任何缓存吗?也许这个问题与缓存陈旧时的行为相关,而不是陈旧时的行为,反之亦然。也许你有一个日期/时间计算溢出或为某些输入做一些时髦的事情?

  4. 连接调试器并让它捕获异常。然后向上走堆栈跟踪并查看失败期间的程序状态。在应用程序正常工作时将其与程序状态进行比较。有什么突出的吗?