PDA

View Full Version : datagrid paging با تعداد رکورد بالا



hamed_bostan
پنج شنبه 11 اسفند 1384, 11:19 صبح
با سلام خدمت دوستان عزیز . من مدتی بود نیاز داشتم به یه راه حلی که دیتا گریدم pagging ئاشته باشه و چون تعداد رکوردم گاه به حدود یک ملیون می رسید server timeout می داد و نمی تونستم از dataset استفاده کنم چون server نمی کشید واسه همین گشتم تا یه استوردپروسیجر پیدا کردم که مشکلم رو حل کرد . شاید دوستان اینو بلد باشند ولی من اونو می ذارم شاید یکی مثل خودم این مشکل رو داشته باشه این روش هر دستور select رو که بهش بدین سه جورایی میشه گفت index می کنه و فقط به تعداد مشخص شده که می خواین رکورد بر می گردونه

hamed_bostan
پنج شنبه 11 اسفند 1384, 11:20 صبح
CREATE procedure FetchItm
(
@SearchSQL nvarchar(4000),
@PageIndex int = 0,
@PageSize int = 10
)

AS
BEGIN

DECLARE @RowsToReturn int
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

-- Set the rowcount
SET @RowsToReturn = @PageSize * (@PageIndex + 1)
SET ROWCOUNT @RowsToReturn

-- Calculate the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

-- Create a temp table to store the results in
create table #tm
(
ID Bigint IDENTITY (1,1) NOT Null,
Itm_ID Bigint
)

-- Fill the temp table
INSERT INTO #tm(Itm_ID)
exec (@SearchSQL)

--Set @TotalResults = @@rowcount


Select A.Itm_ID AS A_ID, A.Itm_Code AS A_Code, Co.Co_Name AS Co_Name, Co_St.Co_Name AS Co_State, Grp.Grp_Name AS Grp_Name, Img.Img AS Img,
A.Itm_Name AS Itm_name, Size.Size_Type AS Itm_Size, A.Itm_Deg AS Itm_Deg, A.Itm_Fire AS Itm_Fire, SPCode.SPCode AS SPCode,
A.Itm_Price AS Itm_Price

from Itm A INNER JOIN
Co ON A.Co_ID = Co.Co_ID INNER JOIN
Co_St ON Co.Co_St = Co_St.Co_ID INNER JOIN
Grp ON A.Grp_ID = Grp.Grp_ID INNER JOIN
Img ON A.Img_ID = Img.Img_ID INNER JOIN
Size ON A.Size_ID = Size.Size_ID INNER JOIN
SPCode ON A.Itm_SpCode = SPCode.SPCode_ID
,#tm R

Where A.Itm_ID=R.Itm_ID

--and r.id>=50 and R.id<=100

And R.ID > @PageLowerBound And R.ID < @PageUpperBound
--Order by title


--exec(@RecordCountSQL)
--Select @TotalResults

--SELECT Duration = GetDate() - @StartTime
END
GO

brida_kh
پنج شنبه 11 اسفند 1384, 11:35 صبح
فکر میکنم استفاده از دیتاگرید که کنترل تقریبا سنگینیه برای این تعداد رکورد مناسب نیست .این صفحه برای لود شدن زمان زیادی میخواد .
برای صفحه بندی کردن سایت ایران ای اس پی مقاله جالبی داره . به راحتی میتونید ازش استفاده کنید.
موفق باشید.
http://iranasp.net/Articles/ShowArticle.aspx?articleid=145

hamed_bostan
پنج شنبه 11 اسفند 1384, 20:05 عصر
خوب دوست عزیز منم از همین روش استفاده کردم . یه نگاه به استورد پروسیجرم بنداز .
موفق باشید

setarehman
دوشنبه 15 اسفند 1384, 18:31 عصر
من از هر طریقی که میخوام خصوصیت صفحه بندی رو فعال کنم نمیشه
از دیتا ست هم استفاده کردم
کسی نمیدونه چرا
اینم کدم
هیچ پیغام خطاایی نمیده ولی کار هم نمیکنه و به صفحه بعد نمیره
Dim istart As Integer
Dim iend As Integer
Dim strselect As String
Dim ds As New DataSet
Dim con As SqlConnection
Dim cmd As SqlCommand
Dim sql As SqlCommand
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
con = New SqlConnection("server=localhost;uid=sa;database=database")
If Not IsPostBack Then
strselect = "select count(*) from td"
cmd = New SqlCommand(strselect, con)
con.Open()
DataGrid1.VirtualItemCount = (cmd.ExecuteScalar() / DataGrid1.PageSize)
con.Close()
bind()
End If
End Sub
Private Sub DataGrid1_PageIndexChanged(ByVal source As System.Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEvent Args)
istart = (e.NewPageIndex * DataGrid1.PageSize)
DataGrid1.CurrentPageIndex = e.NewPageIndex
bind()
End Sub
Sub bind()
Dim dset As DataSet
Dim dd As SqlDataAdapter
iend = istart + DataGrid1.PageSize
strselect = "select * from td where code>@startindex" & " and code<=@endindex order by code"
dd = New SqlDataAdapter(strselect, con)
dd.SelectCommand.Parameters.Add("@startindex", istart)
dd.SelectCommand.Parameters.Add("@endindex", iend)
dset = New DataSet
dd.Fill(dset)
DataGrid1.DataSource = dset
DataGrid1.DataBind()
End Sub
End Class

hamed_bostan
دوشنبه 15 اسفند 1384, 22:49 عصر
ذوست عزیز شما باید در event مخصوص به دیتا گرید pageindexchanged دو خط کد اضافه کنی
me.datagrid1.pageindex=e.currentpageindex
binddata()

که binddata یک زیر روال واسه bind کردن اطلاعات به دیتاگریده

یا حق

setarehman
سه شنبه 16 اسفند 1384, 11:49 صبح
فرک کنم منظورتون این کد باشه چون اینی که شما نویشتید که نمیشه
DataGrid1.CurrentPageIndex = e.NewPageIndex
که اونم اگه این باشه اگه دقیق تر نگاه کنید این خط رو میبینید
مشکل از کجاست
چرا جواب نمیده؟