我是初级开发人员,我是应用程序变量的新手。我有一个存储过程返回一个小的查找表。我想将结果集存储在一个应用程序变量中,以便它可供应用程序使用,但不像静态那样可以进行会话 在我的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。
答案 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;
}