Сначала создайте таблицу (требуется автоматическая нумерация идентификаторов):
создать таблицу redheadedfile(
идентификатор int тождество (1,1),
имена файлов nvarchar(20),
senduser nvarchar(20),
первичный ключ (идентификатор)
)
Затем пишем 500 000 записей:
объявить @i int
установить @i=1
пока @i<=500000
начинать
вставить в значения redheadedfile(filenames,senduser)('мой алгоритм подкачки','Лу Цзюньмин')
установить @i=@i+1
конец
ИДТИ
Используйте Microsoft Visual Studio .NET 2003 для создания веб-страницы WebForm (я назвал ее webform8.aspx).
Фрагмент кода внешнего интерфейса выглядит следующим образом (webform8.aspx):
<%@ Page Language="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="GENERATOR">
<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" метод="post" runat="server">
<asp:datalist id="datalist1" AlternatingItemStyle-BackColor="#f3f3f3" Width="100%" CellSpacing="0"
CellPadding="0" Runat="сервер">
<Шаблон элемента>
<table width="100%" border="0" cellpacing="0" cellpadding="0">
<тр>
<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>
</таблица>
</ItemTemplate>
</asp:datalist>
<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: идентификатор метки ="LCurrentPage" Runat="server"
ForeColor="#ff0000"></asp:label>Page Перейти к странице<asp:TextBox ID="gotoPage" Runat="server" Width ="30px "
MaxLength="5" AutoPostBack="True"></asp:TextBox></div>
</форма>
</тело>
</HTML>
Фрагмент фонового кода выглядит следующим образом (webform8.aspx.cs).
использование системы;
использование System.Collections;
использование System.ComponentModel;
использование System.Data;
использование System.Drawing;
использование System.Web;
использование System.Web.SessionState;
использование System.Web.UI;
использование System.Web.UI.WebControls;
использование System.Web.UI.HtmlControls;
использование System.Data.SqlClient;
использование пространства имен System.Configuration
WebApplication6
;
{
/// <сводка>
/// Краткое описание WebForm8.
/// </сводка>
общедоступный класс WebForm8: System.Web.UI.Page
{
защищенная System.Web.UI.WebControls.LinkButton Fistpage;
защищенный System.Web.UI.WebControls.LinkButton Prevpage;
защищенный System.Web.UI.WebControls.LinkButton Nextpage;
защищенный System.Web.UI.WebControls.LinkButton Lastpage;
защищенный список данных System.Web.UI.WebControls.DataList1;
защищенный 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)
{
если(!Испостбак)
{
RecCount = Calc();//Получаем общее количество записей через функцию Calc()
PageCount = RecCount/PageSize + OverPage();//Рассчитать общее количество страниц (плюс функцию OverPage(), чтобы остатки не приводили к
неполному отображению данных)
ViewState["PageCounts"] = RecCount/PageSize -
ModPage();/ /Сохранить общие параметры страницы в ViewState (за исключением функции ModPage(), чтобы предотвратить переполнение диапазона запроса при выполнении оператора SQL. Чтобы понять это предложение, вы можете использовать алгоритм разбиения на страницы хранимой процедуры).
ViewState["PageIndex"] = 0;//Сохраняем значение индекса страницы, равное 0, во ViewState
ViewState["JumpPages"] = PageCount;//Сохраняем PageCount в ViewState и определяем, превышает ли введенный пользователем номер диапазон
номеров страниц
при переходе.
//Отображение статуса LPageCount и LRecordCount
LPageCount.Text = PageCount.ToString();
LRecordCount.Text = RecCount.ToString();
//Определяем, является ли текстовое поле перехода на страницу недействительным
если (RecCount <= 20)
gotoPage.Enabled = ложь;
TDataBind();//Вызов функции привязки данных TDataBind() для выполнения операций привязки данных
}
}
//Рассчитываем оставшиеся страницы
общественный интервал OverPage()
{
интервал страниц = 0;
если (RecCount%PageSize != 0)
страницы = 1;
еще
страницы = 0;
возврат страниц;
}
//Вычисляем оставшиеся страницы, чтобы предотвратить переполнение диапазона запроса при выполнении оператора SQL.
общественный int ModPage()
{
интервал страниц = 0;
if(RecCount%PageSize == 0 && RecCount != 0)
страницы = 1;
еще
страницы = 0;
возврат страниц;
}
/*
* Статическая функция для расчета общего количества записей
*Причина, по которой я использую здесь статические функции, заключается в следующем: если ссылаются на статические данные или статические функции, соединитель оптимизирует сгенерированный код и удаляет элементы динамического перемещения (
эффект подкачки больших таблиц данных более очевиден).
*Надеюсь, вы выскажете мне свое мнение и поправите меня, если есть какие-либо ошибки.
*/
общедоступный статический int Calc()
{
интервал RecordCount = 0;
SqlCommand MyCmd = new SqlCommand("select count(*) as co from redheadedfile",MyCon());
SqlDataReader dr = MyCmd.ExecuteReader();
если (доктор.Чтение())
RecordCount = Int32.Parse(dr["co"].ToString());
МойCmd.Соединение.Закрыть();
вернуть RecordCount;
}
//Оператор подключения к базе данных (полученный из Web.Config)
общедоступный статический SqlConnection MyCon()
{
SqlConnection MyConnection = новый SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
МоеСоединение.Открыть();
вернуть 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, чтобы выполнить расчеты недействительности кнопок
//Определяем статус четырех кнопок (домашняя страница, предыдущая страница, следующая страница, последняя страница)
если (Текущая страница + 1 > 1)
{
Fistpage.Enabled = правда;
Предыдущая страница.Enabled = правда;
}
еще
{
Fistpage.Enabled = ложь;
Предыдущая страница.Enabled = ложь;
}
если (Текущая страница == Страницы)
{
Следующая страница.Включено = ложь;
Последняя страница.Включено = ложь;
}
еще
{
Следующая страница.Включено = правда;
Последняя страница.Включено = правда;
}
//Привязка данных к элементу управления DataList
DataSet ds = новый DataSet();
//Основные операторы SQL, выполняют операции запроса (определяет эффективность подкачки :))
SqlDataAdapter MyAdapter = new SqlDataAdapter("Выберите верхний "+PageSize+" * из redheadedfile, где идентификатор
отсутствует (выберите верхний идентификатор "+PageSize*CurrentPage+" из redheadedfile в порядке по возрастанию идентификатора) в порядке по возрастанию идентификатора",MyCon());
MyAdapter.Fill(ds,"новости");
datalist1.DataSource = ds.Tables["новости"].DefaultView;
список данных1.DataBind();
//Отображение элемента управления меткой LCurrentPaget и статуса текстового поля gotoPage
LCurrentPage.Text = (CurrentPage+1).ToString();
gotoPage.Text = (CurrentPage+1).ToString();
//Выпускаем адаптер SqlData
МойАдаптер.Расположить();
}
#region Код, созданный конструктором веб-форм
переопределить защищенную пустоту OnInit (EventArgs e)
{
//
// CODEGEN: этот вызов необходим разработчику веб-форм ASP.NET.
//
ИнициализироватьКомпонент();
base.OnInit(е);
}
/// <сводка>
/// Конструктор поддерживает необходимые методы — не используйте редактор кода для изменения
/// Содержимое этого метода.
/// </сводка>
частная пустота InitializeComponent()
{
this.Fistpage.Command += новый System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Prevpage.Command += новый System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Nextpage.Command += новый System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.Lastpage.Command += новый System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
this.gotoPage.TextChanged += новый System.EventHandler(this.gotoPage_TextChanged);
this.Load += новый System.EventHandler(this.Page_Load })
;
#конечныйрегион
//Код страницы перехода
Private void 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>");
еще
{
int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1;//Преобразуем введенное пользователем значение и сохраняем его в
переменной InputPage
типа int
ViewState["PageIndex"] = InputPage;//Записываем значение InputPage во ViewState["PageIndex"]
TDataBind();//Вызовите функцию привязки данных TDataBind(), чтобы снова выполнить операцию привязки данных
}
}
//Перехватываем исключения, вызванные вводом пользователями неверных типов данных
улов (опыт исключения)
{
Response.Write("<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");
}
}
}
}
Давайте попробуем. Эффективность намного выше?
Если что-то не так, пожалуйста, поправьте меня.