ASP.NET調用Oracle分頁預存程序並結合ASPnetpager分頁控制項 實現分頁功能

來源:互聯網
上載者:User

之前用的是GridView內建的分頁功能,那速度啊慢的真實不行  ,決定自訂分頁  Oracle庫裡有5W多條資料

AspnetPager做的還是不錯,拿過來用

Oracle 分頁預存程序:

create or replace package JT_P_page is
type type_cur is ref cursor;                    --定義遊標變數用於返回記錄集
procedure Pagination  (Pindex in number,        --要顯示的頁數索引,從0開始
                       Psql in varchar2,        --產生分頁資料的查詢語句
                       Psize in number,         --每頁顯示記錄數
                       Pcount out number,       --返回的分頁數
                       Prowcount out number,    --返回的記錄數
                       v_cur out type_cur      --返回分頁資料的遊標
                       );
end JT_P_page;
--定義包主體
create or replace package body JT_P_page is
  procedure Pagination(Pindex in number, --要顯示的頁數索引,從0開始
                       Psql in varchar2, --產生分頁資料的查詢語句
                       Psize in number, --每頁顯示記錄數
                       Pcount out number, --返回的分頁數
                       Prowcount out number, --返回的記錄數
                       v_cur out type_cur --返回分頁資料的遊標
                       ) AS
    v_sql VARCHAR2(1000);
    v_Pbegin number;
    v_Pend number;
  begin
    v_sql := 'select count(*) from (' || Psql || ')';
    execute immediate v_sql into Prowcount; --計算記錄總數
    Pcount := ceil(Prowcount / Psize); --計算分頁總數
    --顯示任意頁內容
    v_Pend := Pindex * Psize + Psize;
    v_Pbegin := v_Pend - Psize + 1;    
    v_sql :=  'select * from (' || Psql || ') where rn between ' || v_Pbegin || ' and ' || v_Pend;         
    open v_cur for v_sql;
  end Pagination; 
end JT_P_page;

這個是在網上找的,還不錯  主要是根據偽列 rownum作為where查詢條件  進行帥選,關於rownum偽列可以查看

http://www.cnblogs.com/chinhr/archive/2007/09/30/911685.html  寫的很透徹 ,通過這次做這個Oracle分頁算是對rownum有了初步的認識,實踐出真理 , 有了預存程序截下來就是調用

預存程序有6個參數 前三個是輸入參數,後三個是輸出參數

Help.cs:

 public static DataTable ReturnDataTable(int index,string sql,int pageSize)
    {     
        DataTable dt = new DataTable();
        try
        {          
            OracleParameter []param=new OracleParameter []{new OracleParameter("Pindex",OracleType.Number),new OracleParameter("Psql",OracleType.VarChar),new OracleParameter("Psize",OracleType.Number),new OracleParameter("Pcount",OracleType.Number),new OracleParameter("Prowcount",OracleType.Number),new OracleParameter("v_cur",OracleType.Cursor)};
            param[0].Value = index;
            param[1].Value = sql;
            param[2].Value = pageSize;

            param[0].Direction = ParameterDirection.Input;
            param[1].Direction = ParameterDirection.Input;
            param[2].Direction = ParameterDirection.Input;
            param[3].Direction = ParameterDirection.Output;
            param[4].Direction = ParameterDirection.Output;
            param[5].Direction = ParameterDirection.Output;          

            dt= OracleHelper.ReturnDataTable(OracleHelper.dbCon, CommandType.StoredProcedure, "JT_P_page.Pagination", param);
            Help._rowCount = int.Parse(param[4].Value.ToString()); 
          
        }
        catch (OracleException on)
        {
            throw on;              
        }      
        return dt;
    }

注意一下再調用的時候 參數名必須和預存程序中的參數保持一致 否則可能會報錯  例如:new OracleParameter("Pindex",OracleType.Number)  中的 Pindex 和預存程序procedure Pagination  (Pindex in number 中的一樣,Aspnetpage作為一個第三方控制項,直接從網上下載後 在VS2005工具列裡把.dll導進去  就可以拿來用了  前台頁面Update_Agent.aspx.cs裡:

protected void Page_Load(object sender, EventArgs e)
    {
        
        if (!IsPostBack)
        {
            BindGridView(0, "union_view", _pageSize);         
            AspNetPager1.RecordCount = (Help._rowCount >= 0) ? Help._rowCount : 0;          
        } 
    }

private void BindGridView(int index, string sql, int pageSize)
    {
        DataTable dt;
        if (sql != "")
        {
            ViewState["IsProcedure"] = "yes";
            dt = Help.ReturnDataTable(index, sql, pageSize);
        }
        else
        {
            ViewState["IsProcedure"] = "no";
            dt = Help.ReturnDataTableByCondition(dateinput.Value, dateinput2.Value, orderID.Value.Trim(), dgWay.SelectedValue, AspNetPager1.CurrentPageIndex - 1, AspNetPager1.PageSize);
        }
        iagentView.DataSource = dt;
        DataBind();
        AspNetPager1.RecordCount = (sql!="")?Help._rowCount:Help.ReturnRows(dateinput.Value, dateinput2.Value, orderID.Value.Trim(), dgWay.SelectedValue);
        AspNetPager1.PageSize = pageSize;
        AspNetPager1.CustomInfoHTML = "記錄總數:<font color=\"blue\"><b>" + AspNetPager1.RecordCount.ToString() + "</b></font>";  
        AspNetPager1.CustomInfoHTML += " 總頁數:<font color=\"blue\"><b>" + AspNetPager1.PageCount.ToString() + "</b></font>";  
        AspNetPager1.CustomInfoHTML += " 當前頁:<font color=\"red\"><b>" + AspNetPager1.CurrentPageIndex.ToString() + "</b></font>";  
    }  

   /// <summary>
    /// AspNetPager1   PageChanged事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

protected void AspNetPager1_PageChanged(object sender, EventArgs e)
    {
        if (ViewState["IsProcedure"] != null && ViewState["IsProcedure"].ToString() == "yes")
        BindGridView(AspNetPager1.CurrentPageIndex-1, "union_view", _pageSize);
        else
        BindGridView(AspNetPager1.CurrentPageIndex - 1, "", _pageSize); 
          }

Update_Agent.aspx 裡 AspNetPager 的申明 以及一些屬性的設定  這個網上可以搜的倒

  <webdiyer:AspNetPager ID="AspNetPager1" CssClass="pages" CurrentPageButtonClass="cpb"  runat="server" FirstPageText="首頁" LastPageText="尾頁" NextPageText="下一頁" PrevPageText="上一頁"  AlwaysShow="true" PageIndexBoxType="DropDownList" OnPageChanged="AspNetPager1_PageChanged"  ShowCustomInfoSection="left"  NumericButtonTextFormatString="{0}" >
            </webdiyer:AspNetPager>     

我做了一下測試,用預存程序分頁比原來GridView內建的分頁效率提高了不止一倍 ,時間只有原來的一半不到

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.