问题描述:
使用ASPNETPAGER控件+DATAGRID+分页存储过程
当进行多表查询的时候点击转到第 2 页 ,无数据显示,后面的所有页也没有,但有总页数,第一页显示正常!
使用单表查询显示正常,没有问题。
那位能帮忙修改存储过程或相关代码实现多表查询时显示正常,代码比较长,慢慢看,谢了!
存储过程如下:
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'sp_page')
    BEGIN
        PRINT 'Dropping Procedure sp_page'
        DROP  Procedure  sp_page
    ENDGOPRINT 'Creating Procedure sp_page'
GO
CREATE PROCEDURE sp_page
  @tb         varchar(50), --表名
  @col        varchar(50), --按该列来进行分页
  @coltype    int,         --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
  @orderby    bit,         --排序,0-顺序,1-倒序
  @collist    varchar(800),--要查询出的字段列表,*表示全部字段
  @pagesize   int,         --每页记录数
  @CurrentPage       int,         --指定页
  @Where  varchar(800),--查询条件
  @PageCount      int OUTPUT   --总页数
  
ASDECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)
IF @Where is null or rtrim(@Where)=''
BEGIN--没有查询条件
  SET @where1=' WHERE '
  SET @where2='  '
END
ELSE
BEGIN--有查询条件
  SET @where1=' WHERE ('+@Where+') AND '--本来有条件再加上此条件
  SET @where2=' WHERE ('+@Where+') '--原本没有条件而加上此条件
END
SET @sql='SELECT @PageCount=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize AS varchar)+
         ') FROM '+@tb+@where2
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT--计算总页数
IF @orderby=0
  SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
           ' FROM '+@tb+@where1+@col+'>(SELECT MAX('+@col+') '+
           ' FROM (SELECT TOP '+CAST(@pagesize*(@CurrentPage-1) AS varchar)+' '+
           @col+' FROM '+@tb+@where2+'ORDER BY '+@col+') t) ORDER BY '+@col
ELSE
  SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
           ' FROM '+@tb+@where1+@col+'<(SELECT MIN('+@col+') '+
           ' FROM (SELECT TOP '+CAST(@pagesize*(@CurrentPage-1) AS varchar)+' '+
           @col+' FROM '+@tb+@where2+'ORDER BY '+@col+' DESC) t) ORDER BY '+
           @col+' DESC'
IF @CurrentPage=1--第一页
  SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+' FROM '+@tb+
    @where2+'ORDER BY '+@col+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END
EXEC(@sql)
GOGRANT EXEC ON sp_page TO PUBLICGOhelper数据层如下:
public DataSet SP_PageList(string tb,string col,int coltype,int orderby,string collist,int pagesize,int CurrentPage,string Where,ref int PageCount)
{
SqlConnection mySqlConnection=new SqlConnection(ConnectionString);
SqlCommand cmd= new SqlCommand("sp_page",mySqlConnection);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter sp_temp ;
sp_temp = cmd.Parameters.Add("@tb", SqlDbType.VarChar, 50);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = tb; sp_temp = cmd.Parameters.Add("@col", SqlDbType.VarChar, 50);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = col; sp_temp = cmd.Parameters.Add("@collist", SqlDbType.VarChar, 800);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = collist; sp_temp = cmd.Parameters.Add("@Where  ", SqlDbType.VarChar, 800);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = Where; sp_temp = cmd.Parameters.Add("@pagesize", SqlDbType.Int);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = pagesize; sp_temp = cmd.Parameters.Add("@CurrentPage", SqlDbType.Int);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = CurrentPage; sp_temp = cmd.Parameters.Add("@orderby", SqlDbType.Int);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = orderby; sp_temp = cmd.Parameters.Add("@coltype", SqlDbType.Int);
sp_temp.Direction = ParameterDirection.Input;
sp_temp.Value = coltype; sp_temp = cmd.Parameters.Add("@PageCount", SqlDbType.Int);
sp_temp.Direction = ParameterDirection.Output; DataSet ds = new DataSet();
SqlDataAdapter CommadAdp = new SqlDataAdapter();
CommadAdp.SelectCommand = cmd;
try
{
CommadAdp.Fill(ds);
PageCount = (int)cmd.Parameters["@PageCount"].Value;
mySqlConnection.Close();
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
return ds;
}
业务逻辑层如下:public  DataTable  SP_PageList(string tb,string col,int coltype,int orderby,string collist,int pagesize,int CurrentPage,string Where,ref int PageCount)
{
return help.SP_PageList(tb,col,coltype,orderby,collist,pagesize,CurrentPage,Where,ref PageCount).Tables[0];
}
web调用如下层:
                public int PageCount;
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
CreateDatasourceNews(1);
Aspnetpager1.RecordCount = PageCount;
}
#region  CreateDatasourceNews方法及网站新闻分页相关
//  @tb         varchar(50), --表名
//  @col        varchar(50), --按该列来进行分页
//  @coltype    int,         --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
//  @orderby    bit,         --排序,0-顺序,1-倒序
//  @collist    varchar(800),--要查询出的字段列表,*表示全部字段
//  @pagesize   int,         --每页记录数
//  @CurrentPage       int,         --指定页
//  @Where  varchar(800),--查询条件
//  @PageCount      int OUTPUT   --总页数
private  void  CreateDatasourceNews(int CurrentPage)
{
//问题:当进行多表查询的时候点击转到第 2 页 ,无数据显示,但有总页数,第一页显示正常,单表查询没问题!
string  tb, col, collist, condition;
        
tb = "NewsList,NewsType";
//排序列的列名
col = "NewsDate";
//返回的列名列表 
collist = "NewsDate,Articletitle,ArticleUrl,typeName";
//查询的表件 
condition = "NewsList.Newstypeid=NewsType.Newstypeid And NewsList.NewsTypeid=1 And Newstype.Newstypeid=1"; int coltype,orderby;
coltype = 0;
orderby = 0;
            
WowaInfo.Bussiness.BLL BLL=new WowaInfo.Bussiness.BLL();
DataTable dt = BLL.SP_PageList(tb,col,coltype,orderby,collist,Aspnetpager1.PageSize,Aspnetpager1.CurrentPageIndex,condition,ref PageCount);
this.dgNews.VirtualItemCount = PageCount;
this.dgNews.DataSource = dt.DefaultView;
this.dgNews.DataBind();
}
#endregion
private void Aspnetpager1_PageChanged(object src, Wuqi.Webdiyer.PageChangedEventArgs e)
{
Aspnetpager1.CurrentPageIndex=e.NewPageIndex;
CreateDatasourceNews(dgNews.CurrentPageIndex+1);
                }

解决方案 »

  1.   

    谢了,对SQL不是很熟,修改存储过程老出错。
      

  2.   

    你最好先调试一下搞清楚问题在哪
    如果确定是存储过程的问题,那么最好去MS-SQLServer区问问,那里很多热心的高手的
      

  3.   

    存储过程分页做法:
    1,确认存储过程本身没有问题,测试方法:在查询分析器里进行传递不同的参数进行测试看是否有数据返回
    2,在调用代码调用存储过程前,CommadAdp.Fill(ds);打印你的参数是否正确,再在查询分析器里执行看看。
    3,分页样式采取<a href="page.aspx?query=查询条件param&page=x">x</a> ...进行传递页数
      

  4.   

    刚在存储过程中调试了一下当设置“Current”参数为“2”的时候出现数据为空的现象
    设置为“1”显示分页正常总结分析应该是存储过程的原因谁能帮修改一下我用的那个存储过程 使其能正常显示!谢谢!
      

  5.   

    老大的告诉你步骤了,step by step
      

  6.   

    搞定了 换了个存储过程 数据量太大 千万级的 谢谢孟老师,各位Csdn网友!结贴 回家过年 
    顶者有分!新年快乐 各位!