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

本文关键字:应用程序 变量 错误 存储 存储过程 结果 | 更新日期: 2023-09-27 18:27:53

我是一名初级开发人员,对应用程序变量不熟悉。我有一个存储过程,它返回一个小的查找表。我想将结果集存储在一个应用程序变量中,这样它就可以用于应用程序,但不能像静态那样进行会话。
在我的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没有任何作用的事实,当我快速观察它时,我收到了一个错误当数据读取器关闭时调用"read"不是一个有效的操作在谷歌上搜索发现了一些线程,但最终没有帮助。我想把结果集存储在一个可管理的结构中,比如字典之类的
MVC 4.5,EF 6。

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

根据以下线程,当数据读取器关闭时调用"read"不是一个有效的操作,如果启用了延迟求值(如果您愿意,可以禁用它),则在请求时执行查询。当您打开强制执行查询的quickwatch时。到那时,显然数据读取器已经关闭,因此无法执行查询,因此出现了错误。您需要做的是在调用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;          
}