我使用ODS(ObjectDataSource)获取Gridview控件来获取数据。为了获得最佳性能和效率,我关闭了Gridview的视图状态(即EnableViewstate =“false”。
我还在关联的Objectdatasource中启用了缓存。这消除了高达50-60%的性能优化,因为它消除了DB往返..礼貌的ODS缓存。
所以,在此之后我陷入了着名的“ODS排序”问题,但我设法为它创造了一个棘手的解决方案,并且它的工作正常:
Optimize Pagination & Sorting with ObjectDataSource having EnableCaching = true
接下来的分页,它也运行良好。现在,我需要在Gridview的顶部显示“Total records:X”。好吧,我部署了以下方法:
protected void ods_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
if(e.ReturnValue != null && e.ReturnValue.GetType() == typeof(int))
base.setTotalLabel(lblTotal, e.ReturnValue);
}
不要混淆 - base.setTotalLabel是我自己的方法来设置带有count的标签文本。这也很好,但问题是 -
每当ODS从中获取数据时 它的缓存不会触发 ODS_Selecting或ODS_Select事件。 它们只是“被旁路”,因为它 从缓存中获取数据。这就是我 无法刷新总记录 算!
我希望我的问题解释得很好,这很棘手。我已经准备好为此做任何技巧或脏代码了,因为我想维护ODS缓存,而且由于偶然的“错误更新”而无法回滚更改。
请帮助!
答案 0 :(得分:1)
这对我有用我设置了CacheKeyDependency,并且每当我想刷新时我都明确地将它设置为一个新值。如果我想显式刷新,我在querystring中传递& refresh = 1。
在.aspx -
<asp:ObjectDataSource ID="odsOrg" runat="server" SelectMethod="SearchOrg" ... EnableCaching="true" CacheDuration="60" CacheKeyDependency="key1">
在代码背后 -
public const string argRefresh = "refresh=1";
public void CheckExpiredCacheKey(string ckey)
{
if (Cache[ckey] == null)
Cache[ckey] = new object(); //Set Cache key which will b used to manually expire ODS cache
if (!IsPostBack && Request.QueryString["refresh"] == "1")//check refresh flag
{
//Cache.Remove(ckey);//NOT NEEDED: use the following instead
Cache[ckey] = new object();// Needed otherwise it'll call Grid-populate twice
}
}
答案 1 :(得分:0)
我有完全相同的问题?
我一直在做的解决方案是在gridview数据绑定方法中再次调用select count方法(通过BLL)并将其存储在viewstate var中,然后使用它来显示记录数。但这导致了两件事:
答案 2 :(得分:0)
我通过在所选事件期间将记录计数存储在会话变量中来解决此问题:
protected void odsSearchResults_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
DataTable resultsTable = e.ReturnValue as DataTable;
if (resultsTable == null)
{
return;
}
Session["ResultCount"] = resultsTable.Rows.Count;
lblRecordCount.Text = resultsTable.Rows.Count.ToString();
}
然后在Page_Load中,如果session var不为null,则显示记录计数:
if(Session["ResultCount"] != null)
{
lblRecordCount.Text = Session["ResultCount"].ToString();
}
现在,如果数据来自缓存,lblRecordCount将显示记录计数