将存储过程结果集存储在应用程序变量错误中

时间:2014-10-25 21:47:05

标签: c# entity-framework stored-procedures model-view-controller

我是初级开发人员,我是应用程序变量的新手。我有一个存储过程返回一个小的查找表。我想将结果集存储在一个应用程序变量中,以便它可供应用程序使用,但不像静态那样可以进行会话 在我的global.asax:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        Application["lookup"] = FunctionThatGetsSprocResult();                      
    }

我的数据库调用功能

  internal static ObjectResult<GetLookupTable_Result> FunctionThatGetsSprocResult()
    {
        ObjectResult<GetLookupTable_Result> result;
        using (dbContext db = new dbContext())
        {
            result = db.GetLookupTable();               
        }
        return result;          
    }


在我的控制器中:

    public ActionResult Index()
    {
        var myVar = (ObjectResult<GetLookupTable_Result>)HttpContext.Application["lookup"];

        return View();
    }

忽略它实际上没有对myVar做任何事情的事实,当我快速观察它时,我收到错误 当关闭datareader时调用'read'不是有效的操作 在google搜索时发现了一些线索,但最终没有帮助。我想将结果集存储在可管理的结构中,如字典或其他东西。
MVC 4.5,EF 6。

1 个答案:

答案 0 :(得分:2)

根据以下线程calling 'read' when the datareader is closed is not a valid operation,如果启用延迟评估,则会在请求时执行查询(如果您愿意,可以禁用它)。当您打开强制查询执行的快速监视时。通过时间显然是关闭了datareader,因此无法执行查询,从而导致错误。您需要做的是在调用FunctionThatGetsSprocResult()之后立即调用ToList()。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    Application["lookup"] = FunctionThatGetsSprocResult();
    ((ObjectResult<GetLookupTable_Result>)Application["lookup"]).ToList();              
}

这样您就可以请求获取查询结果了! 或者您可以更改FunctionThatGetsSprocResult并在其中调用ToList():

internal static ObjectResult<GetLookupTable_Result> FunctionThatGetsSprocResult()
{
    ObjectResult<GetLookupTable_Result> result;
    using (dbContext db = new dbContext())
    {
        result = db.GetLookupTable();               
    }
    result.ToList();
    return result;          
}