0

我在我的网站上使用 RadGrid 控件,并为 radgrid 启用分页,并在 sql profiler 上监视它的活动,我知道 radgrid 为每个分页获取数据,然后显示当前页面的数据。

 DataSet obj_Dataset = new DataSet(); //  is global

这是我写的代码Page_Load

protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection obj_SqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConection"].ToString());
        SqlCommand obj_sqlCommand = new SqlCommand();
        obj_sqlCommand.CommandText = "select ProductID,ProductName,CategoryID from products";
        obj_sqlCommand.CommandType = CommandType.Text;
        obj_sqlCommand.Connection = obj_SqlConnection;

        SqlDataAdapter obj_DataAdapter = new SqlDataAdapter(obj_sqlCommand);
        obj_SqlConnection.Open();
        obj_DataAdapter.Fill(obj_Dataset, "Products");
        obj_DataAdapter.Dispose();
        obj_sqlCommand.Dispose();
        obj_SqlConnection.Close();
    }

这是我的代码RadGrid1_NeedDataSource

 protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
    {

        RadGrid1.DataSource = obj_Dataset.Tables["Products"];

    }

我正在使用 ASP.net 2010 和 Sqlserver 2008。

4

2 回答 2

2

当您在 RadGrid 上实现分页时,每次更改页面时,它将只检索当前页面所需的记录。这实际上是分页的好处之一。如果您希望它仅在第一次加载页面时获取数据,则必须在此后的每次回发中保留整个数据集。

我理解您希望最小化数据库连接的愿望,但如果您有足够的记录需要分页,您最好允许分页按设计工作,而不是尝试将整个数据集保存在服务器或 ViewState 中。可能还值得考虑您为什么要避免使用数据库。是不是太慢了?您可能想要优化数据库索引、评估结构或研究缓存。

但是,如果这是您真正想做的事情,并且您了解风险,则可以考虑使用 Cache 对象,如此所述。

例如:

protected void RadGrid1_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
    var products = Cache["products"] as DataTable;
    if(products == null)
    {
       products = obj_Dataset.Tables["Products"];
       Cache.Insert("products", products , null, DateTime.Now.AddHours(6), TimeSpan.Zero);
    }

    RadGrid1.DataSource = products;
}

关于这种方法,您需要了解一些事情。首先,Cache对于应用程序来说是全局的,所以存储的数据Cache对于每个用户来说必须是相同的。其次,Cache不会自动更新自己,所以如果你更新你的数据,你必须明确地更新你Cache的代码。如果您有经常更改的数据,Cache则不是一个好地方。第三,Cache占用内存空间,所以如果你在其中存储大量数据集,你的应用程序就会受到影响。

于 2012-04-23T18:56:13.527 回答
1

我使用这个存储过程来解决问题:参数由 radgrid 属性填充:

     Create PROCEDURE  [dbo].[CastumPaging]
                    (
                       @SqlTableName nvarchar(100),
                       @OrderColumn nvarchar (30),
                       @Direction nvarchar(5),
                       @PageIndex int,
                       @PageSize int
                    )
                    AS
                    BEGIN
                    declare @SQLText nvarchar(500)

                     set @SQLText = 'SELECT * FROM (SELECT top 100 PERCENT * , ROW_NUMBER() 
                          OVER(ORDER BY '+@OrderColumn+' '+ @Direction + ' ) as RowNum 
                          FROM '+@SqlTableName+'  order by '+@OrderColumn+' '+@Direction +' )
                          as DerivedTableName WHERE RowNum BETWEEN '+
                          str(@PageIndex * @PageSize) +' AND'+ 
                          str((@PageIndex* @PageSize) +@PageSize -1) 

                    exec(@SQLText)
                    END
于 2012-04-25T18:30:30.173 回答