我在我的网站上使用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。
答案 0 :(得分:2)
在RadGrid上实现分页时,每次更改页面时,它都只会检索当前页面所需的记录。这实际上是分页的好处之一。如果您希望它仅在第一次加载页面时获取数据,则必须在此后的每次回发中保留整个数据集。
我理解您希望最小化数据库连接,但如果您有足够的记录来要求分页,那么最好让分页按设计工作,而不是试图将整个数据集保存在服务器或ViewState中。也可能值得考虑为什么要避免使用数据库。太慢了吗?您可能希望优化数据库索引,评估结构或查看缓存。
但是,如果这是你真正想做的事情,并且你了解风险,你可以考虑使用Cache对象,如here所述。
例如:
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
占用内存空间,因此如果您在其中存储大型数据集,您的应用程序将受到影响。
答案 1 :(得分: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