后台如何进行调用存储过程。。传参在哪传。。怎么写。。

解决方案 »

  1.   

    datagrid自定义分页是datagrid的一个重要的功能,datagrid自定义分页主要用于数据源较大时。因为数据源大(记录多),加载时间长,反应慢,耗服务器的资源。而且每显示一页就要重新加载所有的数据。而如果我们用自定义分页,则每一次只加载一页的记录,也就是只加载我们要显示的记录。这样加载数据时间短,反应快,节约服务器的资源。在做项目的过程中,我们也经常需要用到自定义功能。今天我们就说说怎样自定义分页。   
      先看看datagrid的自定义分页的原理,它主要依据两个主要属性,第一个就是VirtualItemCount属性,它表示datagrid一共要显示多少条记录,它就是的作用是用于生成pager(分页导航行),通过结合另外两个属性pagesize和PageButtonCount,datagrid就知道要分成多少页了及当前要显示多少个分页按钮,我们不难得到总共要显示的总页数=(VirtualItemCount+pagesize-1)/pagesize;如要总页数<PageButtonCount,则显示总页数个按钮;如果总页数>PageButtonCount,则显示PageButtonCount个按钮,当然到了最后一页就只显示VirtualItemCount%   pagesize(总记录条数除以每页显示记录的余数)个按钮。另一个重要的属性就是datasource(数据源),自定义分页的一个重要的特点是显示数据源中所有的记录,如果数据源中有一条记录,则显示一条记录;如果数据源中有一万条记录,则它会显示一万条记录,可能你的机子就慢了   :   )。所以自定义最重要的一点是如何设置或获取数据源了。   
      接下来,我们先说说自定义分页的主要步骤:   
      1.设置datagrid的VirtualItemCount属性;   
      2.获取datagrid的datasource(数据源);   
      3.绑定数据到datagrid;   
      4.设置新页的页码(datagrid.currentpageindex属性)。   
      重复上述2,3,4步。   
      下面我们以一个例子来讲解datagrid   的自定义过程。   
      例子要求机子装有ms   sql   server   7.0   或   2000,当然还要能运行asp.net页了(废话)。   
      我们先来写一个通用的存储过程,用于分页,返回某页的要显示的记录集,及一个输出参数--总的记录条数,但这个存储过程有缺陷,例如只能用于单表查询,必须要有条件语句等。   
      CREATE   PROCEDURE   up_custompage   @vc_order_column_name   varchar(100),@vc_select_column_list   varchar(100),   
      @vc_select_table_list   varchar(100),@vc_condition   varchar(100),@page_size   int,@current_page   int,@total1   int   output     
      /*   
      (   
      @vc_order_column_name   :表要排序列的列名,只能按一列排序,而且该列必须得在输出列表中;   
      @vc_select_column_list   :返回列的列名列表;   
      @vc_select_table_list:要查询的表名;   
      @vc_condition:查询条件的字符串,必须要有查询条列,否则会抛出异常;   
      @page_size:每页显示记录的条数;   
      @current_page:当前页的页码;   
      @total1:所有符合条件的记录的总数。   
      构造的sql语句=select   top   每页显示记录的条数   *   from   (select   top   每页显示记录的条数   返回列的列名列表   from   要查询的表名   where   要排序列的列名   in   (select   top   每页显示记录的条数   X   当前页的页码     要排序列的列名     from   要查询的表名   where   查询条件   order   by   要排序列的列名)   order   by   要排序列的列名   desc   )   as   temp1   order   by   要排序列的列名   
      )   
      */   
      AS   
      --声明要用到的变量,@temp1是正常的分页语句字符串,@temp2是最后一页的分页语句字符串,@page_total表一共有几页,@last_page   
      --是最后一页的页码   
      declare   @temp1   varchar(500),@temp2   nvarchar(500),@page_total   int,@last_page   int   
      --构造获得总页的数的检索语句   
      set   @temp2=N'select   @total2=count(*)   from   '   +   @vc_select_table_list   +   '   where   '   +   @vc_condition   
      --执行检索语句,取得总的记录条数   
      exec   sp_executesql   @temp2,N'   @total2   int   output   ',@total1   output   
        
      /*构造分页检索语句,基本原理是先取出@page_size*@current_page条记录,相当于是取出当前页及当前页前面的所有页面的记录然后取出当前面所要显示的记录,也就是反序排序后取前@page_size条记录;最后再反序排序(因为前面的顺序被反排过一次,现在再反排一次,正好是我们要的顺序),最后执行,返回结果集。   
      */   
      if   @total1>0   
      begin   
      set   @page_total=(@total1+@page_size-1)/@page_size   
      --如果当前页不是最后一页   
      if   @current_page<@page_total   
      set   @temp1='select   top   '   +   cast(@page_size   as   varchar(4))   +   '   *   from     
      (select   top   '   +   cast(@page_size   as   varchar(4))     +   '   '   +   @vc_select_column_list   +   '   from   '   +   @vc_select_table_list   +'   where   '   +   @vc_order_column_name     
      +   '   in   (select   top   '   +   cast(@page_size*@current_page   as   varchar(10))   +   '   '   +   @vc_order_column_name   +   '   from   '   +     
      @vc_select_table_list   +   '   where   '+   @vc_condition     +   '   order   by   '   +   
      @vc_order_column_name   +   ')   order   by   '   +   @vc_order_column_name     +   '   DESC)   as   temp1   order   by   '   +   @vc_order_column_name     
      else   
      --最后一页只返回分页后的最后几条记录,也就是@total1%@page_size条记录   
      begin   
      set   @last_page=@total1%@page_size   
      set   @temp1='select   top   '   +   cast(@last_page   as   varchar(4))   +   '   *   from     
      (select   top   '   +   cast(@last_page   as   varchar(4))     +   '   '   +   @vc_select_column_list   +   '   from   '   +   @vc_select_table_list   +'   where   '   +   @vc_order_column_name     
      +   '   in   (select   top   '   +   cast(@total1   as   varchar(10))   +   '   '   +   @vc_order_column_name   +   '   from   '   +     
      @vc_select_table_list   +   '   where   '+   @vc_condition     +   '   order   by   '   +   
      @vc_order_column_name   +   ')   order   by   '   +   @vc_order_column_name     +   '   DESC)   as   temp1   order   by   '   +   @vc_order_column_name     
      end   
      --执行检索   
      exec(@temp1)   
      end   
      else   
      return   
      

  2.   


     public DataTable SelectData(string sql, Wuqi.Webdiyer.AspNetPager AspNetPager1)
            {
                SqlParameter SqlParam = new SqlParameter("@Sql", sql);
                SqlParameter PageIndexParam = new SqlParameter("@PageIndex", AspNetPager1.CurrentPageIndex);
                SqlParameter PageSizeParam = new SqlParameter("@PageSize", AspNetPager1.PageSize);
                DataSet ds = daEx.GetDataSet("PageRecord", CommandType.StoredProcedure, SqlParam, PageIndexParam, PageSizeParam);
                Common.CommonClass.InitAspPageInfo(ds, ref AspNetPager1);
                return FullRow(ds.Tables[1], AspNetPager1.PageSize);
            }public DataTable FullRow(DataTable dt, int Count)
            {
                for (int i = dt.Rows.Count; i < Count; i++)
                {
                    DataRow dr = dt.NewRow();
                    dt.Rows.Add(dr);
                }
                return dt;
            }
      

  3.   

    ALTER  procedure   [dbo].[PageRecord]     
      @Sql   nvarchar(4000),   --查询字符串     
      @PageIndex   int,   --第n页     
      @PageSize   int   --每页行数     
      as     
      set   nocount   on     
      declare   @p1   int,   --p1是游标的id     
      @rowcount   int     
      exec   sp_cursoropen   @p1   output,@Sql,@scrollopt=1,@ccopt=1,@rowcount=@rowcount   output     
      set   @PageIndex=(@PageIndex-1)*@PageSize+1     
      exec   sp_cursorfetch   @p1,16,@PageIndex,@PageSize      
      select @rowcount
      --select   ceiling(1.0*@rowcount/@pagesize)   as   总页数--,@rowcount   as   总行数,@currentpage   as   当前页       
      exec   sp_cursorclose   @p1     
      set   nocount   off 
      

  4.   

    参考.....
    百万级 分页存储过程....  
    http://blog.csdn.net/wellknow/archive/2004/07/29/55167.aspx