当点GridView的其他页数时,显示一片空白。我的代码:    protected void Page_Load(object sender, EventArgs e)
    {
 if (IsPostBack == false) 
 {
          SqlDataSource1.SelectCommand = "SELECT ID,BookName, ISBN, Author, Publisher, IsRenew, BookConcision, Pages, price, Class_number, CONVERT (char(10), Pub_date, 120) AS Pub_date, BookID FROM Book_Info WHERE " + DropDownList1.SelectedValue + " like @sr1 ORDER BY Pub_date DESC"; };
 
 }
 
 
 
 上网找了一些资料这么说的:” SqlDataSource都是先提取所有的记录,然后只显示本页需要显示的记录,然后抛弃其余的记录,都有点浪费资源的啦!“
 
 
 是不是每次显示分页时都要求执行SqlDataSource1.SelectCommand一次,否则GridView得不到数据?
 
 
 各位有什么好的解决方案呢?

解决方案 »

  1.   

    的确如此,这跟我们过去编程实现DataGrid分页道理基本一样,也是先把所有数据装载到DataTable中,所以,分页存储过程应该还有用
      

  2.   

    每次翻页都需要从数据库取数据这个操作不可缺少(除非你把所有数据都放在Session里,但这更不好,吃内存), 不过可以每次读取的时候只取出当前页需要的有限条数据,性能会明显提高,分页存储过程的目的就在于此,下面给个例子:
    ALTER PROC PageView
    @tbname     sysname,           --要分页显示的表名
    @FieldKey   sysname,           --用于定位记录的主键(惟一键)字段,只能是单个字段
    @PageCurrent int=1,             --要显示的页码
    @PageSize   int=10,            --每页的大小(记录数)
    @FieldShow  nvarchar(1000)='',  --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
    @FieldOrder  nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                              --用于指定排序顺序
    @Where     nvarchar(1000)='',  --查询条件
    @PageCount  int OUTPUT        --总页数
    AS
    DECLARE @sql nvarchar(4000)
    SET NOCOUNT ON
    --检查对象是否有效
    IF OBJECT_ID(@tbname) IS NULL
    BEGIN
    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
    RETURN
    END
    IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
    BEGIN
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    RETURN
    END--分页字段检查
    IF ISNULL(@FieldKey,N'')=''
    BEGIN
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
    RETURN
    END--其他参数检查及规范
    IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
    IF ISNULL(@PageSize,0)<1 SET @PageSize=10
    IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
    IF ISNULL(@FieldOrder,N'')=N''
    SET @FieldOrder=N''
    ELSE
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
    IF ISNULL(@Where,N'')=N''
    SET @Where=N''
    ELSE
    SET @Where=N'WHERE ('+@Where+N')'--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
    IF @PageCount IS NULL
    BEGIN
    SET @sql=N'SELECT @PageCount=COUNT(*)'
    +N' FROM '+@tbname
    +N' '+@Where
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
    END--计算分页显示的TOPN值
    DECLARE @TopN varchar(20),@TopN1 varchar(20)
    SELECT @TopN=@PageSize,
    @TopN1=@PageCurrent*@PageSize--第一页直接显示
    IF @PageCurrent=1
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder)
    ELSE
    BEGIN
    SELECT @PageCurrent=@TopN1,
    @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
    +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
    +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder
    SET ROWCOUNT @PageCurrent
    EXEC sp_executesql @sql,
    N'@n int,@s nvarchar(4000) OUTPUT',
    @PageCurrent,@sql OUTPUT
    SET ROWCOUNT 0
    IF @sql=N''
    EXEC(N'SELECT TOP 0'
    +N' '+@FieldShow
    +N' FROM '+@tbname)
    ELSE
    BEGIN
    SET @sql=STUFF(@sql,1,1,N'')
    --执行查询
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' WHERE '+@FieldKey
    +N' IN('+@sql
    +N') '+@FieldOrder)
    END
    END
      

  3.   

    使用分页存储过程后,就不再使用GridView控件自带的分页功能,自己实现结合SqlDataSource,例如可以在页面上放一个TextBox存放“页码”,SqlDataSource的SelectCommand的参数值直接指向这个控件,就可以了
      

  4.   

    每一页都只取回当前页的数据就好了:
    第1页: select top 10 * from table01 order by id
    第2页: select top 10 * from table01 where id not in (select top 10 * from table01 order by id) order by id
    第2页: select top 10 * from table01 where id not in (select top 20 * from table01 order by id) order by id
    ...
    第n页:"select top 10 * from table01 where id not in (select top" + (n-1)*10 + " * from table01 order by id) order by id"