datagrid存儲過程分頁完整實例

WebForm2.aspx页面

<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Inherits="page.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm2</title>
<meta name="vs_showGrid" content="False">
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">

<aspataGrid id="CustomerList" runat="server" AutoGenerateColumns="False">
<Columns>
<aspoundColumn DataField="id" HeaderText="id"></aspoundColumn>
<aspoundColumn DataField="text" HeaderText="text"></aspoundColumn>
</Columns>
<PagerStyle HorizontalAlign="Right" Mode="NumericPages"></PagerStyle>
</aspataGrid>

<asp:LinkButton id="LinkButton1" runat="server" CommandName="up">LinkButton</asp:LinkButton>
<asp:LinkButton id="LinkButton2" runat="server" CommandName="down">LinkButton</asp:LinkButton>


<asp:Label id="Label1" runat="server"></asp:Label>
</form>
</body>
</HTML>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Configuration;

namespace page
{
/// <summary>
/// WebForm2 的摘要说明。
/// </summary>
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid CustomerList;
protected System.Web.UI.WebControls.LinkButton LinkButton1;
protected System.Web.UI.WebControls.LinkButton LinkButton2;
protected System.Web.UI.WebControls.Label Label1;
private function p = new function();
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
TimeSpan startTime = DateTime.Now.TimeOfDay;

if (!Page.IsPostBack)
Bind();

Label1.Text = DateTime.Now.TimeOfDay.Subtract(startTime).TotalMilliseconds.ToString();
}

private void Bind()
{
if (ViewState["PageIndex"] == null)
ViewState["PageIndex"] = 0;
SqlConnection    MyConnection=new    SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
//string    strKeyword=Keyword.Text.Trim().Replace("\'","\'\'");
//string    strSalesId=Sales.SelectedItem.Value;
int    RecordCount=CalcRecordCount();
//RecordNumber.Text=RecordCount.ToString();
//LblRecordNumber.Text=RecordCount.ToString();
string    strExpress="Id<>0";
//if    (strKeyword!="")
//strExpress=strExpress+"    and    (companyenname    like    '%"+strKeyword+"%'    or    companychname    like    '%"+strKeyword+"%'    or    Companyshortname    like    '%"+strKeyword+"%'    or    web    like    '%"+strKeyword+"%'    or    mainproduct    like    '%"+strKeyword+"%'    or    phone    like    '%"+strKeyword+"%'    or    memo    like    '%"+strKeyword+"%'    or    address    like    '%"+strKeyword+"%'    or    linkmanphone    like    '%"+strKeyword+"%')";
//if    (strSalesId!="")
//strExpress=strExpress+"    and    salesid="+strSalesId;
SqlCommand    MyCommand=new    SqlCommand();
MyCommand.Connection=MyConnection;
MyCommand.CommandText="GetRecordFromPage";
MyCommand.CommandType=CommandType.StoredProcedure;
MyCommand.Parameters.Add("@tblName","test1");
MyCommand.Parameters.Add("@fldName","id");
MyCommand.Parameters.Add("@strWhere",strExpress);
MyCommand.Parameters.Add("@PageSize",CustomerList.PageSize);
MyCommand.Parameters.Add("@PageIndex",(int)ViewState["PageIndex"] + 1);
MyConnection.Open();
SqlDataReader MyReader = MyCommand.ExecuteReader();
CustomerList.VirtualItemCount = RecordCount;
CustomerList.DataSource = MyReader;
CustomerList.DataKeyField="id";
CustomerList.DataBind();
MyReader.Close();
MyConnection.Close();
MyConnection.Dispose();
}

private int CalcRecordCount()
{
string sql = "select count(id) from test1";
return (int)p.ExecuteScalar(sql);
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.LinkButton1.Command += new System.Web.UI.WebControls.CommandEventHandler(this.up);
this.LinkButton2.Command += new System.Web.UI.WebControls.CommandEventHandler(this.up);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void up(object sender, System.Web.UI.WebControls.CommandEventArgs e)
{
LinkButton btn = (LinkButton)sender;
switch(btn.CommandName)
{
case "up":
ViewState["PageIndex"] = (int)ViewState["PageIndex"] - 1;
break;
case "down":
ViewState["PageIndex"] = (int)ViewState["PageIndex"] + 1;
break;
}
Bind();

}

}
}

CREATE    PROCEDURE    GetRecordFromPage   
           @tblName              varchar(255),                --    表名   
           @fldName              varchar(255),                --    字段名   
           @PageSize            int    =    10,                        --    页尺寸   
           @PageIndex          int    =    1,                          --    页码   
           @IsCount              bit    =    0,                          --    返回记录总数,    非    0    值则返回   
           @OrderType          bit    =    0,                          --    设置排序类型,    非    0    值则降序   
           @strWhere            varchar(1000)    =    ''      --    查询条件    (注意:    不要加    where)   
   AS   
    
   declare      @strSQL        varchar(2000)            --    主语句   
   declare    @strTmp        varchar(1000)            --    临时变量   
   declare    @strOrder    varchar(1000)                --    排序类型   
    
   if    @OrderType    !=    0   
   begin   
           set    @strTmp    =    "<(select    min"   
           set    @strOrder    =    "    order    by    ["    +    @fldName    +"]    desc"   
   end   
   else   
   begin   
           set    @strTmp    =    ">(select    max"   
           set    @strOrder    =    "    order    by    ["    +    @fldName    +"]    asc"   
   end   
    
   set    @strSQL    =    "select    top    "    +    str(@PageSize)    +    "    *    from    ["   
           +    @tblName    +    "]    where    ["    +    @fldName    +    "]"    +    @strTmp    +    "(["   
           +    @fldName    +    "])    from    (select    top    "    +    str((@PageIndex-1)*@PageSize)    +    "    ["   
           +    @fldName    +    "]    from    ["    +    @tblName    +    "]"    +    @strOrder    +    ")    as    tblTmp)"   
           +    @strOrder   
    
   if    @strWhere    !=    ''   
           set    @strSQL    =    "select    top    "    +    str(@PageSize)    +    "    *    from    ["   
                   +    @tblName    +    "]    where    ["    +    @fldName    +    "]"    +    @strTmp    +    "(["   
                   +    @fldName    +    "])    from    (select    top    "    +    str((@PageIndex-1)*@PageSize)    +    "    ["   
                   +    @fldName    +    "]    from    ["    +    @tblName    +    "]    where    ("    +    @strWhere    +    ")    "   
                   +    @strOrder    +    ")    as    tblTmp)    and    ("    +    @strWhere    +    ")    "    +    @strOrder   
    
   if    @PageIndex    =    1   
   begin   
           set    @strTmp    =    ""   
           if    @strWhere    !=    ''   
                   set    @strTmp    =    "    where    ("    +    @strWhere    +    ")"   
    
           set    @strSQL    =    "select    top    "    +    str(@PageSize)    +    "    *    from    ["   
                   +    @tblName    +    "]"    +    @strTmp    +    "    "    +    @strOrder   
   end   
    
   if    @IsCount    !=    0   
           set    @strSQL    =    "select    count(*)    as    Total    from    ["    +    @tblName    +    "]"   
    
   exec    (@strSQL)
GO

修正一下自己的错误

TimeSpan startTime = DateTime.Now.TimeOfDay; //《-语句条A

if (!Page.IsPostBack)
Bind();

Label1.Text = DateTime.Now.TimeOfDay.Subtract(startTime).TotalMilliseconds.ToString();//《-语句条B

语句条A和B应该放在Bind()子程式的首和尾。

程式修改后的运行时间是每次翻页都为200毫秒多点。

用DATAGRID自带的分页控件进行分页实测100W数据行,翻页时间基本为5000-13000毫秒,主要用DATASET分页。

用存储过程分页本机[内存+虚拟内存]消耗大概
aspnet_wp.exe 实际内存:26,440k 虚拟内存:17,608k
sqlservr.exe   实际内存:26,752k 虚拟内存:29,092k

用.NET的DATASET分页,本机[内存+虚拟内存]消耗大概
aspnet_wp.exe 实际内存:73,512k 虚拟内存:91,352k
注:每次翻页因为DataSet会把数据输入到内存中,所以aspnet_wp.exe消耗的实际内存和虚拟内存相加会高达近400,000k
也就是越翻页,占用内存越多,当然.net会自己释放内存,
但消耗过多的内存也使计算机运行速度变慢了很多。
sqlservr.exe   实际内存:39,664k 虚拟内存:51,132k

posted on 2008-08-04 09:39  风乔  阅读(145)  评论(0编辑  收藏  举报

导航