【问题标题】:SqlDataSource_OnSelected: Get data (DataTable) without re-executing the querySqlDataSource_OnSelected:无需重新执行查询即可获取数据(DataTable)
【发布时间】:2015-05-19 20:43:47
【问题描述】:

我有一个绑定到 GridView 的 SqlDataSource,其 SQL 需要大约 10 秒来检索数据。

还有一个名为“PageSizeControl”的用户控件,它挂钩了 GridView 的 SqlDataSource 的选定事件。在这种情况下,我需要DataTable来准备PageSizeControl的一些设置。

目前,我正在使用以下代码:

protected void ds_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
    SqlDataSourceView dsv = (sender as SqlDataSourceView);
    dsv.Selected -= ds_Selected;
    DataTable dt = (dsv.Select(DataSourceSelectArguments.Empty) as DataView).Table;
    int iRowCount = dt.Rows.Count;

    // some gui-adaption like visibility, text, ...
 }

在旧版本中,我们使用 e.AffectedRows。但是当过滤器应用于数据源时,存储在 e.AffectedRows 中的值不正确。我们有一些用例,我们不仅需要行数,还需要整个 DataTable。

问题是,.Select() 重新执行 Db-Query,这需要另外 10 秒才能完成。

我还尝试打开 SqlDataSource 的缓存:

EnableCaching="true" CacheDuration="Infinite"

但这没有帮助有两个原因: 1.访问缓存数据时不触发OnSelected事件 2. 如果触发了 OnSelected 事件(因为尚未缓存数据),.Select() 仍然在未缓存的情况下执行,需要 10 秒。

是否有人知道我如何在不费时地重新执行查询的情况下获取数据?最好是在 OnSelected 中,但我愿意接受其他建议。

【问题讨论】:

    标签: c# asp.net gridview sqldatasource


    【解决方案1】:

    我运行了一个符合我要求的解决方法。我使用事件 GridView.OnRowDataBound 并获取第一个 GridRow 的 DataItem,其中包含 DataTable。

    private DataTable oData = null;
    protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (oData == null && e.Row.DataItem != null)
        {
            oData = (e.Row.DataItem as DataRowView).Row.Table;
        }
    }
    

    这个解决方案有效,但它看起来很脏,它需要一个 GridView(在我的情况下没问题)。如果有更干净的解决方案,我将不胜感激。

    更新 在对IlSpy 进行更长时间的研究后,我得出的结论是无法在 OnSelected 事件中获取数据。即使启用缓存也不会,因为缓存是在 OnSelected 之后写入的。

    所以最简单的方法就是开启缓存,在需要数据的地方调用SqlDataSource.Select(...)函数。

    另一种方法是自己用SqlDataSource.Select(...) 获取数据,然后将表绑定到控件上。但这有一些缺点。例如:当绑定到数据集/数据表时,GridView 上的排序和分页不能开箱即用。

    还有一种方法是从选择它的控件中提取数据。有关 GridView 的示例,请参见上文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2023-03-27
      相关资源
      最近更新 更多