存储过程代码:CREATE proc page @RecordCount int output, @QueryStr nvarchar(100)='table1',--表名、视图名、查询语句 @PageSize int=20, --每页的大小(行数) @PageCurrent int=1, --要显示的页 @FdShow nvarchar (1000)='*', --要显示的字段列表 @IdentityStr nvarchar (100)='id', --主键 @WhereStr nvarchar (200)='1=1 and id % 11111 = 0', @FdOrder nvarchar(100)='id', --排序 @isReturn bit=0as declare @sql nvarchar(2000) set @sql = '' if @WhereStr = '' begin set @WhereStr = '1=1' enddeclare @tsql nvarchar(200)if(@isReturn=1)begin set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output end else begin set @RecordCount = @PageSize * @PageCurrent + 1 endif @PageCurrent = 1 begin set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr end else begin set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '> ( select max(' + @IdentityStr + ') from (select top ' + cast(@PageSize*(@PageCurrent-1) as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ') as t) order by ' + @IdentityStr end if @FdOrder <>'' and @FdOrder<>@IdentityStr begin set @sql = 'select * from (' + @sql + ') as t4867435348493 order by ' + @FdOrder end --print @sql execute(@sql) GO 后台代码: protected System.Web.UI.WebControls.DataGrid DataGrid1;
@RecordCount int output,
@QueryStr nvarchar(100)='table1',--表名、视图名、查询语句
@PageSize int=20, --每页的大小(行数)
@PageCurrent int=1, --要显示的页
@FdShow nvarchar (1000)='*', --要显示的字段列表
@IdentityStr nvarchar (100)='id', --主键
@WhereStr nvarchar (200)='1=1 and id % 11111 = 0',
@FdOrder nvarchar(100)='id', --排序
@isReturn bit=0as
declare
@sql nvarchar(2000)
set @sql = ''
if @WhereStr = '' begin
set @WhereStr = '1=1'
enddeclare @tsql nvarchar(200)if(@isReturn=1)begin
set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr
exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output
end
else begin
set @RecordCount = @PageSize * @PageCurrent + 1
endif @PageCurrent = 1 begin
set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr
end
else begin
set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '> ( select max(' + @IdentityStr + ') from (select top ' + cast(@PageSize*(@PageCurrent-1) as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ') as t) order by ' + @IdentityStr
end
if @FdOrder <>'' and @FdOrder<>@IdentityStr begin
set @sql = 'select * from (' + @sql + ') as t4867435348493 order by ' + @FdOrder
end
--print @sql
execute(@sql)
GO
后台代码: protected System.Web.UI.WebControls.DataGrid DataGrid1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
DataGrid1DataBind(1);
}
} private void DataGrid1DataBind(int page)
{
SqlConnection conn = new SqlConnection("server=qq;uid=sa;pwd=***;database=testdb"); SqlCommand cmd = new SqlCommand("page",conn);
cmd.CommandType = CommandType.StoredProcedure; SqlParameter p1 = cmd.Parameters.Add("@RecordCount",SqlDbType.Int);
p1.Direction = ParameterDirection.Output;
SqlParameter p = cmd.Parameters.Add("@PageCurrent",SqlDbType.Int);
p.Value = page; SqlDataAdapter da = new SqlDataAdapter();
DataSet ds = new DataSet();
da.SelectCommand = cmd;
da.Fill(ds);
DataGrid1.DataSource = ds.Tables[0].DefaultView;
int count = int.Parse(cmd.Parameters["@RecordCount"].Value.ToString());
if(null == ViewState["page"] || "" == ViewState["page"].ToString())
{
ViewState["page"] = count.ToString();
}
else
{
count = int.Parse(ViewState["page"].ToString());
}
DataGrid1.VirtualItemCount = count; DataGrid1.DataBind();
} private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
DataGrid1DataBind(e.NewPageIndex + 1);
}
学习一下网页分页就行,通过存储过程或者直接写SQL读取部分数据把这部分数据绑定到DataGrid就行了
protected void dgInsideSite_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
{
//进行分页设置
this.dgInsideSite.CurrentPageIndex = e.NewPageIndex; this.dgInsideSite.DataSource = ViewState["dataInsideSite"] as DataTable;
int CurrentPage = 0;
if (this.dgInsideSite.CurrentPageIndex == this.dgInsideSite.PageCount - 1)
{
if (this.dgInsideSite.CurrentPageIndex == 0)
{
this.dgInsideSite.CurrentPageIndex = this.dgInsideSite.PageCount - 1;
}
else
{
if (this.dgInsideSite.Items.Count % this.dgInsideSite.PageSize == 1)
{
CurrentPage = 2;
}
else
{
CurrentPage = 1;
}
this.dgInsideSite.CurrentPageIndex = this.dgInsideSite.PageCount - CurrentPage;
}
}
this.dgInsideSite.DataBind();
}
其中dgInsideSite是你datagrid的名称
dataInsideSite是一个viewstate,viewstate的设置是在你用datatable绑定datagrid的时候,把此datatable也赋值给此viewstate,这样不用每次都访问数据库,Ex:this.ViewState["dataInsideSite"] = ds.Tables[0];
……
我的思路也只是一个简单的分页而已!原理是这样的:
首先获取一个datatable(不论是写存储过程还是直接在程序里写SQL语句)
然后需要给datagrid进行绑定,在绑定的同时,把datatable也赋值给ViewState(this.ViewState["dataInsideSite"] = ds.Tables[0];)下次访问就在viewstate里取数据就可以了,不用再去访问数据库
然后在datagrid的PageIndexChanged()事件下面放上那些代码,就可以达到一个分页的效果!
……
但是,如果数据量过大的话,效率也并不高!
……
"用存储过程,每次读取对应页的数据"这方法是可行,但貌似对楼主不适用!