PDA

View Full Version : مشکل با دیتاگرید(تکراری نیست)



javad3151
شنبه 01 بهمن 1384, 13:34 عصر
سلام
یک دیتاگرید داریم که اطلاعات را بصورت paging نشان میده اطلاعات این دیتاگرید بصورت راندوم داخلش قرار می گیره (با استفاده از order by newid) در دستور sql .
مشکل اینجاست که چون هر بار که کاربر یک صفحه از دیتاگرید را درخواست می کند یکبار دستور sql اجرا می شود, صفحات ثابت نیستند یعنی اگر دوبار به صفحه اول بروید اطلاعات متفاوتی می بینید
چطور میشه این مشکل رو حل کرد؟؟
این هم کد برنامه:


Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
readdata()
End If

End Sub
Sub readdata()
Dim cn As SqlConnection
Dim cmd1 As SqlCommand
Dim adp As SqlDataAdapter

Dim sql As String

cn = New SqlConnection(ConfigurationSettings.AppSettings.It em("constr"))
cn.Open()

sql = "SELECT * FROM dbo.users order by newid()"

adp = New SqlDataAdapter(sql, cn)
adp.Fill(ds)
Me.DataGrid1.DataSource = ds
DataBind()
cn.Close()
End Sub

Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, _
ByVal e As System.Web.UI.WebControls.DataGridPageChangedEvent Args) _
Handles DataGrid1.PageIndexChanged
DataGrid1.CurrentPageIndex = e.NewPageIndex
Me.readdata()
End Sub

javad3151
یک شنبه 09 بهمن 1384, 08:50 صبح
اساتید, بزرگان, مدعیان ...
اگر ممکنه جواب این پست عن قریب کپک زده من رو هم بدید

Farhad.B.S
یک شنبه 09 بهمن 1384, 09:15 صبح
خوب نباید با هر بار درخواست صفحه یکبار دستور SQL رو اجرا کنید.
بلکه باید در هنگام لود صفحه خروجی دستور SQL رو در یک محفظه مثل Dataset نگهداری کرده و در هنگام تغییر صفحات از اون به عنوان دیتاسورس استفاده کنید.
(این محفظه رو میشه در ViewState یا Session کاربر یا ... نگهداری کرد و با هر بار لود صفحه بدون postback اون رو مجددا مقداردهی کرد.)

javad3151
یک شنبه 09 بهمن 1384, 17:53 عصر
به نظر شما یک دیتا گرید 100 صفحه ای یا بیشتر را اگر در ViewState یا Session کاربر نگهداری کنیم (در حالیکه ممکنه 100 کاربر هم آنلاین دارند همون صفحه رو نگاه می کنند) خیلی برنامه سنگین نمیشه؟؟؟!!!!
این کار استاندارده؟

Farhad.B.S
یک شنبه 09 بهمن 1384, 19:31 عصر
خیر ، استاندارد نیست ، همونطور که زدن کانکشن به دیتابیس و لود این اطلاعات در هربار تغییر صفحه نیز صحیح و استاندارد نیست.
درصورتی که حجم داده زیادتر از اونه که بشه از روش بالا استفاده کرد میتونی با توجه به ساختار برنامت ، از روش های مختلفی مثل کش کردن دیتاسورس و یا لود اطلاعات به صورت صفحه به صفحه از بانک استفاده کنی.
به هرحال چیزی که مهمه ، نگهداشتن نتیجه کئوری در یک محفظه و استفاده از اون به عنوان دیتاسورس خواهد بود.