PDA

View Full Version : آموزش: آموزش Custom Paging & Sorting در Sql2005 همراه با نمونه كد براي دانلود



Mostafa_Dindar
دوشنبه 21 دی 1388, 19:55 عصر
سلام .

در مورد Custom Paging & Sorting بارها و بارها در این سایت بحث شده . بخشی از آنها مربوط به Sql2000 هست و بخش دیگری از آنها که در مورد Sql2005 هست تنها در مورد Paging بحث شده و بیشتر به نحوه پیاده سازی StoredProcedure پرداخته شده . و هنوز ابهامات زیادی دراین مورد باقی مونده.
من قصد دارم در این مقاله به طور مفصل به صورت گام به گام به Sorting و Paging در سطح دیتابیس بپردازم .

در انتها فایل پروژه ضمیمه شده که همراه با آن فایل دیتابیس با 50 هزار رکورد موجود است و در آنجا تفاوت سرعت و کارایی را مشاهده خواهید کرد . کد با دات نت 2.0 نوشته شده پس میتوانید با VS 2005 , VS 2008 استفاده کنید . و برای اجرای تنظیمات خاصی لازم نیست و تنها کافیه Ctr + F5 بزنید .
همچنین مثال به صورت معماری 3 لایه پیاده سازی شده تا دوستان تازه کار هم با آن آشنا شوند .

Paging:

اهمیت Paging بر هیچ کس پوشیده نیست . مواقعی هست که منطقی نیست همه رکوردها رو یکجا به کاربر نشون بدیم . خوب پس باید Paging رو اعمال کنیم . این کار چندین جا امکان پذیر هست :
یک روش میتونه Client Side Paging باشه که توسط جاوا اسکریپت اینکار رو میکنیم .
اینجا چند تا نمونه هست که میتونید دنبال کنید که از حوزه بحث ما خارجه .
Client-side Paging for DataGrids (http://msdn.microsoft.com/en-us/magazine/cc164022.aspx)
Client Side Table Sorting, Paging and Filtering with jQuery (http://beckelman.net/post/2008/10/23/Client-Side-Table-Sorting-Paging-and-Filtering-with-jQuery-Demo.aspx)

همچنین Paging میتونه درBusiness Layer رخ بده . در این حالت شما یک لیستی از آبجکتها رو از DataSource میخونید و اونا رو Paging میکنید که من در پروژه ضمیمه اون رو پیاده سازی کردم ولی این مبحث نیز مربوط به بحث این مقاله نیست .

همچنین اگه تعداد رکوردها کم باشه میتونیم از DataSet استفاده کنیم . در صورت استفاده از DataSet ما میتوانیم از ویژگیهای Built-In داخل GridView و ListView , FormView , DetailsView برای Paging and Sorting استفاده کنیم . ولی همانطور که میدونید در صورتی که از DataSet استفاده کنیم عملا در ابتدا همه رکوردها واکشی میشوند . فرض کنید کوئری ما 50 هزار رکورد رو برمیگردونه و ما PageSize کنترلGridView رو برابر 10 قرار بدیم . در این صورت ابتدا همه 50 هزار رکورد در حافظه لود شده ولی تنها 10 تای اول رو نشون میده . پس عملا میشه گفت Paging ما مجازی هست . البت%D

Mostafa_Dindar
دوشنبه 21 دی 1388, 20:00 عصر
حال که Sproc ما کامل شد بهتره به کدهامون در ASP.NET برگردیم .

کد من در لایه دیتا خیلی سادست . از لایه تجاری فراخوانی میشه و پارامتر ها رو میگیره و رکوردهای متناسب برمیگردونه

در لایه Bll هم کار خاصی صورت نمیگیره تنها با پارمترهای متفاوت Dal رو فراخوانی میکنه


[DataObjectMethod(DataObjectMethodType.Select, false)]
public static EmployeesCollection SelectListByDepartmentID(int departmentID,int startRowIndex, int maximumRows, string sortExpression)
{
if (departmentID == 0)
return SelectAll(startRowIndex, maximumRows, sortExpression);
else
return EmployeesDB.SelectListByDepartmentID( departmentID, startRowIndex, maximumRows, sortExpression);
}

public static int SelectListByDepartmentIDCount(int departmentID , int startRowIndex, int maximumRows, string sortExpression)
{
System.Web.HttpContext context = System.Web.HttpContext.Current;
if (departmentID == 0)
{
if (context.Cache["SelectAllCount"] == null)
context.Cache["SelectAllCount"] = EmployeesDB.SelectAllCount();
return (int)context.Cache["SelectAllCount"];
}
else
{
return EmployeesDB.SelectListByDepartmentIDCount(departme ntID);
}
}

قسمت اعظم کار ما انجام شده و تنها کافی هست یک Gridview در فرم قرار داده به ObjectDataSource ای که رکورد های رو بر میگردونه Bind کنیم :


<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
DataObjectTypeName="MD.TestPagingData.BusinessEntities.Employees"
DeleteMethod="Delete" EnablePaging="True" InsertMethod="Insert"
OldValuesParameterFormatString="original_{0}"
SelectCountMethod="SelectListByDepartmentIDCount"
SelectMethod="SelectListByDepartmentID" SortParameterName="sortExpression"
TypeName="MD.TestPagingData.Bll.EmployeesManager" UpdateMethod="Update">
<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="departmentID"
PropertyName="SelectedValue" Type="Int32" DefaultValue="0" />
<asp:Parameter Name="startRowIndex" Type="Int32" />
<asp:Parameter Name="maximumRows" Type="Int32" />
<asp:Parameter Name="sortExpression" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>دقت کنید که ObjectDataSource پارامتر هایی بنام MaximumRowsParameterName , StartRowIndexParameterName دارد که به طورپیش فرض مقادیر زیر را دارند :
maximumRowsو startRowIndex. چنانچه در Bll متد شما نام پارمترهایش متفاوت بود باید این Property ها رو مقدار دهی کنید مثلا :

MaximumRowsParameterName="RowMax"
StartRowIndexParameterName="RowIndexStart"کار دیگری نمونده که انجام بدیم . پروژه رو ميتونيد دانلود كنيد .
امیدوارم تونسته باشم کمکی کرده باشم .

موفق باشید

دانلود
(http://www.4shared.com/file/BOqLM2qK/ImplementingPagingAndSorting.html)

Behrouz_Rad
چهارشنبه 23 دی 1388, 14:06 عصر
کاربر shocraneh@
لطفاً فقط در حوزه ی تاپیک مربوطه بحث کنید. این چندمین بار هست که این تذکر به شما داده میشه.

متشکرم.

Zabi42
شنبه 31 اردیبهشت 1390, 02:01 صبح
لطفا یه لینک جدید برای دانلود بزارید
این کار نمی کنه!!!!!!!!!!!

grobech
دوشنبه 02 آبان 1390, 15:13 عصر
سلام
اگر کسی کد رو از قبل برداشته لطفا بزاره
متشکرم

moferferi
سه شنبه 03 آبان 1390, 00:08 صبح
جناب اقای دیندار من از روش زیر که در مدل entity هست واسه paging استفاده میکنم.
نظرتون نسبت به روشی که شما مثال زدین چیه.از لحاظ سرعت و کارایی تفاوتی داره.؟
int index = 0;
if (Request["pagenumber"] != null)
{
index = Int32.Parse(Request["pagenumber"]);
}
int skip=index*5;
WebDBEntities db = new WebDBEntities();
var lst = (from s in db.Products
orderby s.Id
select s).Skip(skip).Take(5);

Repeater1.DataSource = lst;
Repeater1.DataBind();

Mostafa_Dindar
سه شنبه 03 آبان 1390, 00:27 صبح
جناب اقای دیندار من از روش زیر که در مدل entity هست واسه paging استفاده میکنم.
نظرتون نسبت به روشی که شما مثال زدین چیه.از لحاظ سرعت و کارایی تفاوتی داره.؟
int index = 0;
if (Request["pagenumber"] != null)
{
index = Int32.Parse(Request["pagenumber"]);
}
int skip=index*5;
WebDBEntities db = new WebDBEntities();
var lst = (from s in db.Products
orderby s.Id
select s).Skip(skip).Take(5);

Repeater1.DataSource = lst;
Repeater1.DataBind();

تفاوتی ندارند . در واقع لینک با استفاده از Skip و Take همان Custom Paging را انجام میدهد .

rahimi.mohamad24
پنج شنبه 10 آذر 1390, 12:31 عصر
سلام
لینک دانلود خراب شده،میشه لطفا دوباره بذارید