먼저 테이블을 만듭니다(ID 자동 번호 매기기 필요).
테이블 redheadedfile 생성(
id int 신원(1,1),
파일 이름 nvarchar(20),
사용자 보내기 nvarchar(20),
기본 키(id)
)
그런 다음 500,000개의 레코드를 작성합니다.
@i int 선언
@i=1로 설정
@i<=500000 동안
시작하다
redheadedfile(filenames,senduser) 값('내 페이징 알고리즘','Lu Junming')에 삽입
@i=@i+1로 설정
끝
가다
Microsoft Visual Studio .net 2003을 사용하여 WebForm 웹 페이지를 만듭니다(저는 webform8.ASPx로 명명했습니다).
프런트 엔드 코드 조각은 다음과 같습니다(webform8.aspx):
<%@ 페이지 언어="C#" Codebehind="WebForm8.aspx.cs" AutoEventWireup="false" Inherits="WebApplication6.WebForm8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<헤드>
<title>WebForm8</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="생성기">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content=" http://schemas.microsoft.com/intellisense/ie5 " name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="서버">
<asp:datalist id="datalist1" AlternatingItemStyle-BackColor="#f3f3f3" Width="100%" CellSpacing="0"
CellPadding="0" Runat="서버">
<항목 템플릿>
<table width="100%" border="0" cellpacing="0" cellpadding="0">
<tr>
<td width="30%"
align="center"><%#DataBinder.Eval(Container.DataItem,"filenames")%></td>
<td width="30%"
align="center"><%#DataBinder.Eval(Container.DataItem,"senduser")%></td>
<td width="30%"
align="center"><%#DataBinder.Eval(Container.DataItem,"id")%></td>
</tr>
</table>
</ItemTemplate>
</asp:데이터 목록>
<div align="center">총계<asp:label id="LPageCount" Runat="server" ForeColor="#ff0000"></asp:label>페이지/총계
<asp:label id="LRecordCount" Runat= "server" ForeColor="#ff0000"></asp:label>기록
<asp:linkbutton id="Fistpage" Runat="server"
CommandName="0">홈</asp:linkbutton> <asp:linkbutton id="Prevpage" Runat="server" CommandName ="prev">
이전 페이지</asp:linkbutton> <asp:linkbutton id="Nextpage" Runat="server"
CommandName="next">다음 페이지</asp:linkbutton >  ; <asp:linkbutton id="Lastpage" Runat="server"
CommandName="last">마지막 페이지</asp:linkbutton> 현재 페이지<asp: 라벨 ID ="LCurrentPage" Runat="server"
ForeColor="#ff0000"></asp:label>페이지 점프 페이지<asp:TextBox ID="gotoPage" Runat="server" Width ="30px "
MaxLength="5" AutoPostBack="True"></asp:TextBox></div>
</form>
</body>
</HTML>
배경 코드 조각은 다음과 같습니다(webform8.aspx.cs).
시스템 사용;
System.Collections 사용;
System.ComponentModel 사용;
System.Data 사용;
System.드로잉 사용;
System.Web 사용;
System.Web.SessionState 사용;
System.Web.UI 사용;
System.Web.UI.WebControls 사용;
System.Web.UI.HtmlControls 사용;
System.Data.SqlClient 사용;
System.Configuration
네임스페이스 WebApplication6
사용
{
/// <요약>
/// WebForm8에 대한 요약 설명입니다.
/// </summary>
공개 클래스 WebForm8 : System.Web.UI.Page
{
보호된 System.Web.UI.WebControls.LinkButton Fistpage;
protected System.Web.UI.WebControls.LinkButton 이전 페이지;
보호된 System.Web.UI.WebControls.LinkButton 다음 페이지;
보호된 System.Web.UI.WebControls.LinkButton 마지막 페이지;
보호된 System.Web.UI.WebControls.DataList datalist1;
protected System.Web.UI.WebControls.DropDownList mydroplist;
보호된 System.Web.UI.WebControls.Label LPageCount;
보호된 System.Web.UI.WebControls.Label LRecordCount;
보호된 System.Web.UI.WebControls.Label LCurrentPage;
보호된 System.Web.UI.WebControls.TextBox gotoPage;
const int PageSize=20; //각 페이지에 표시되는 레코드를 정의합니다.
int PageCount,RecCount,CurrentPage,Pages,JumpPage;//페이징 매개변수를 저장하기 위한 여러 변수 정의
개인 무효 Page_Load(개체 전송자, System.EventArgs e)
{
if(!IsPostBack)
{
RecCount = Calc();//Calc() 함수를 통해 총 레코드 수를 가져옵니다.
PageCount = RecCount/PageSize + OvERPage();//총 페이지 수 계산(나머지가 불완전한 표시 데이터를 유발하는 것을 방지하기 위한 OverPage() 함수 포함
)
ViewState["PageCounts"] = RecCount/PageSize -
ModPage();/ /ViewState에 총 페이지 매개변수 저장(SQL 문 실행 시 쿼리 범위가 오버플로되는 것을 방지하기 위한 ModPage() 함수 제외. 저장 프로시저 페이징 알고리즘을 사용하면 이 문장을 이해할 수 있음)
ViewState["PageIndex"] = 0;//ViewState에 페이지 인덱스 값 0을 저장합니다.
ViewState["JumpPages"] = PageCount;//ViewState에 PageCount를 저장하고 점프 시 사용자 입력 수가
페이지 번호
범위를 초과하는지 확인합니다.
//LPageCount 및 LRecordCount의 상태를 표시합니다.
LPageCount.Text = PageCount.ToString();
LRecordCount.Text = RecCount.ToString();
//페이지 이동 텍스트 상자가 잘못된지 확인합니다.
if(RecCount <= 20)
gotoPage.Enabled = 거짓;
TDataBind();//데이터 바인딩 함수 TDataBind()를 호출하여 데이터 바인딩 작업을 수행합니다.
}
}
//남은 페이지 계산
공개 int OverPage()
{
정수 페이지 = 0;
if(RecCount%PageSize != 0)
페이지 = 1;
또 다른
페이지 = 0;
반환 페이지;
}
//SQL 문 실행 시 쿼리 범위가 오버플로되는 것을 방지하기 위해 남은 페이지 수를 계산합니다.
공개 int ModPage()
{
정수 페이지 = 0;
if(RecCount%PageSize == 0 && RecCount != 0)
페이지 = 1;
또 다른
페이지 = 0;
반환 페이지;
}
/*
*총 기록을 계산하는 정적 함수
*여기서 정적 함수를 사용하는 이유는 정적 데이터나 정적 함수를 참조하는 경우 커넥터가 생성된 코드를 최적화하고 동적 재배치 항목을 제거하기 때문입니다(
대량 데이터 테이블의 페이징 효과가 더 분명합니다).
*의견을 말씀해 주시고, 틀린 부분이 있으면 정정해 주시기 바랍니다.
*/
공개 정적 int Calc()
{
int RecordCount = 0;
SqlCommand MyCmd = new SqlCommand("redheadedfile에서 공동으로 count(*) 선택",MyCon());
SqlDataReader dr = MyCmd.ExecuteReader();
if(dr.Read())
RecordCount = Int32.Parse(dr["co"].ToString());
MyCmd.Connection.Close();
RecordCount를 반환합니다.
}
//데이터베이스 연결 문(Web.Config에서 가져옴)
공개 정적 SqlConnection MyCon()
{
SqlConnection MyConnection = new SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
MyConnection.Open();
MyConnection을 반환합니다.
}
//네 개의 버튼(홈 페이지, 이전 페이지, 다음 페이지, 마지막 페이지)에서 반환되는 CommandName 값을 연산합니다.
개인 무효 Page_OnClick(개체 전송자, CommandEventArgs e)
{
CurrentPage = (int)ViewState["PageIndex"];//ViewState에서 페이지 번호 값을 읽고 매개변수
계산을
위해 CurrentPage 변수에 저장합니다.
Pages = (int)ViewState["PageCounts"];//ViewState에서 전체 페이지 매개변수 작업 문자열 읽기
cmd = e.CommandName;
스위치(cmd)//필터 명령 이름
{
사례 "다음":
현재페이지++;
부서지다;
사례 "이전":
현재페이지--;
부서지다;
"마지막" 경우:
현재페이지 = 페이지;
부서지다;
기본:
현재페이지 = 0;
부서지다;
}
ViewState["PageIndex"] = CurrentPage;//계산된 CurrentPage 변수를 ViewState에 다시 저장
TDataBind();//데이터 바인딩 함수 TDataBind() 호출
}
개인 무효 TDataBind()
{
CurrentPage = (int)ViewState["PageIndex"];//ViewState에서 페이지 번호 값을 읽고 버튼
무효화
작업을 위해 CurrentPage 변수에 저장합니다.
Pages = (int)ViewState["PageCounts"];//ViewState에서 전체 페이지 매개변수를 읽어 버튼 무효화 계산을 수행합니다.
//네 개의 버튼(홈페이지, 이전 페이지, 다음 페이지, 마지막 페이지)의 상태를 확인합니다.
if (현재 페이지 + 1 > 1)
{
Fistpage.Enabled = true;
Prevpage.Enabled = true;
}
또 다른
{
Fistpage.Enabled = 거짓;
Prevpage.Enabled = 거짓;
}
if (현재 페이지 == 페이지)
{
Nextpage.Enabled = 거짓;
Lastpage.Enabled = 거짓;
}
또 다른
{
Nextpage.Enabled = true;
Lastpage.Enabled = true;
}
//DataList 컨트롤에 데이터 바인딩
DataSet ds = 새로운 DataSet();
//핵심 SQL 문, 쿼리 작업 수행(페이징 효율성 결정:))
SqlDataAdapter MyAdapter = new SqlDataAdapter("ID가 없는 redheadedfile에서 상위 "+PageSize+" * 선택
(id asc로 redheadedfile에서 상위 "+PageSize*CurrentPage+" id 선택) id asc로 순서",MyCon());
MyAdapter.Fill(ds,"뉴스");
datalist1.DataSource = ds.Tables["news"].DefaultView;
datalist1.DataBind();
//레이블 컨트롤 LCurrentPaget 표시 및 텍스트 상자 컨트롤 gotoPage 상태
LCurrentPage.Text = (현재페이지+1).ToString();
gotoPage.Text = (CurrentPage+1).ToString();
//SqlDataAdapter 릴리스
MyAdapter.Dispose();
}
#region Web Forms Designer에서 생성된 코드
보호된 void OnInit(EventArgs e) 재정의
{
//
// CODEGEN: 이 호출은 ASP.NET Web Forms 디자이너에 필요합니다.
//
초기화구성요소();
base.OnInit(e);
}
/// <요약>
/// 디자이너는 필수 메서드를 지원합니다. 코드 편집기를 사용하여 수정하지 마세요.
/// 이 메소드의 내용입니다.
/// </summary>
개인 무효 초기화 구성 요소()
{
this.Fistpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Prevpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Nextpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Lastpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.gotoPage.TextChanged += new System.EventHandler(this.gotoPage_TextChanged);
this.Load += new System.EventHandler(this.Page_Load)
}
#endregion
//페이지 이동 코드
개인 무효 gotoPage_TextChanged(개체 전송자, System.EventArgs e)
{
노력하다
{
JumpPage = (int)ViewState["JumpPages"];//ViewState에서 사용 가능한 페이지 값을 읽고 JumpPage 변수에 저장합니다.
//사용자 입력 값이 사용 가능한 페이지 범위 값을 초과하는지 확인
if(Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0)
Response.Write("<script>alert('페이지 범위가 범위를 벗어났습니다!');location.href='WebForm8.aspx'</script>");
또 다른
{
InputPage 변수
에 저장
ViewState["PageIndex"] = InputPage;//ViewState["PageIndex"]에 InputPage 값 쓰기
TDataBind();//데이터 바인딩 함수 TDataBind()를 호출하여 데이터 바인딩 작업을 다시 수행합니다.
}
}
//사용자가 잘못된 데이터 유형을 입력하여 발생한 예외를 포착합니다.
catch(예외 exp)
{
Response.Write("<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");
}
}
}
}
한번 시도해 볼까요? 효율성이 훨씬 높나요?