【问题标题】:Store a stored procedure result set in application variable error将存储过程结果集存储在应用程序变量错误中
【发布时间】:2014-12-21 10:51:52
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    根据以下线程calling 'read' when the datareader is closed is not a valid operation,查询在请求时执行,如果启用延迟评估(如果您愿意,可以禁用它)。当您打开强制执行查询的快速监视时。显然到那个时候数据读取器已关闭,因此无法执行查询,因此出现错误。您需要做的是在调用 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;          
    }
    

    【讨论】:

    • 您的分析是正确的,但解决方案不正确。该函数应返回db.GetLookupTable().ToList(),因此在释放上下文之前执行查询。这意味着方法的返回类型也应该改变。
    • 基于@Sotiris 的回答和 Gert 的评论,我最终做了: db.GetLookupTable().ToDictionary(x=>x.Id, x=>x.Name);在我的控制器中: var myVar = (Dictionary)HttpContext.Application["lookup"];我在这种情况下使用字典,因为它只是键值对。感谢两位!
    • Gert 的建议更简洁,但字典也很好。很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多