PDA

View Full Version : صفحه بندی Record ها با DataReader



ealireza
چهارشنبه 03 فروردین 1384, 12:21 عصر
من برای خواندن اطلاعات از DataReader استفاده کردم اما برای صفحه بندی با مشکل برخورد کردم
اگه میشه راهنمایی کنید چطوری میشه فقط 20 رکورد نو هر صفحه نمایش داد بصورتی که 80 تا رکورد باشه بشه 4 صفحه
میدونم خود Reader همچین قابلیتی نداره از DataSet و DataGrid هم نمیخواهم استفاده کنم

titbasoft
چهارشنبه 03 فروردین 1384, 15:05 عصر
یک راه حل هم نوشتن یک query که براتون شماره ردیف رو برگردونه و شما هم هر چی می خواید رو بردارید
http://www.barnamenevis.org/forum/viewtopic.php?t=21405

ealireza
چهارشنبه 03 فروردین 1384, 19:56 عصر
بهترین راه همون استفاده از dataset هست چون می دونید که می شه بهش بگید از رکورد n ام m تا رو بیار. اما یک راه حل دیگه هم نوشتن یک query که براتون شماره ردیف رو برگردونه و شما هم هر چی می خواید رو برداری
http://www.barnamenevis.org/forum/viewtopic.php?t=21405این برنامه خیلی خیلی سنگینه و بیشتر از 1540 تا کاربر هم زمان ازش استفاده میکنن
پس dataset سنگین میشه

اگه میشه همین رو راهنمایی کنید

titbasoft
پنج شنبه 04 فروردین 1384, 00:27 صبح
این که کند تر از dataset عمل می کنه که :sorry:
شما از data adapter می تونید برای fill کردن به این صورت که می خواین استفاده کنید . و فکر هم نمی کنم با این تعداد user ها کم بیاره :wink:

ealireza
پنج شنبه 04 فروردین 1384, 02:49 صبح
این که کند تر از dataset عمل می کنه که :sorry:
شما از یکی از پلیمورفیس های data adapter می تونید برای fill کردن به این صورت که می خواین استفاده کنید . و فکر هم نمی کنم با این تعداد user ها کم بیاره :wink:نه دوست من کل برنامه رو Datareader پیاده شده

اینو در نظر داشته باشید که Dataset از رم استفاده میکنه و ...
DataReader خیلی خیلی قوی هست حتی text. رو با Reader ساختن ....


حالا اگه میشه یکی راهنمایی کنه ...
فقط لطفا VB.net

منتظر هستم آقای نصیری و.....

مرسی ..

Behrouz_Rad
پنج شنبه 04 فروردین 1384, 21:26 عصر
در خیلی از سایت ها دیدم که برای ایجاد یک صفحه نورد (اصطلاحی که در سایت IranASPNET برای آن گذاشته شده)، از روش های نا معقول استفاده می کنند.
حتی یکی از دوستان نیز در سایت IranASPNET از روشی بسیار پیچیده استفاده کرده بود که البته از ایشون انتظار بیشتری می رفت.
البته نیازی به DataReader نیست. (در ادامه دلیلش رو متوجه میشید)
بنده به شخصه ار تابعی که خودم نوشتم همیشه استفاده می کنم و بهترین نتیجه رو هم می گیرم.
ابتدا یک متغیر سرتاسری تعریف کنید:


Dim NumRec As Int32

و سپس پروسیجر زیر رو بنویسید: (البته این شکل ساده شده ی پروسیجر بنده هست، برای تشخیص اینکه در کدام صفحه هستید و غیر فعال کردن لینک اون صفحه، باید از ViewState استفاده کنید و کد زیر رو کمی تغییر بدید)



Public Sub LinkLoop(ByVal NumRow As Int32)

Dim NumPage As Int32
NumPage = NumRow \ 10
If NumRow Mod 10 <> 0 Then NumPage += 1
For CounterX As Int32 = 1 To NumPage
Response.Write("<a href='MyPage.aspx?p=" & CounterX & "'>" & CounterX & " " & "</a>")
Next
End Sub

بعد از اینکه تعداد رکوردها خوانده شد و در متغیر NumRec قرار گرفت (NumRec = MyCommand.ExecuteScalar)، در فایل aspx به شکل زیر فراخوانی کنید:


برو به صفحه <% LinkLoop(NumRec) %>

به همین راحتی!
:wise1:

titbasoft
پنج شنبه 04 فروردین 1384, 23:21 عصر
اگر اشتباه نکنم با این روش جناب راد هر بار باید تمامی رکورد ها select شود. اگر اشتباه میکنم لطفا بگید چطوری رکورد های مثلا صفحه سوم رو انتخاب می کنید :گیج:

اینم خود Microsoft ، البته این با اون چیزی که من گفتم فرق می کنه. گمان کنم جوابتون رو به راحتی بدست بیارید.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconpagingthroughqueryresult.asp
:flower:


از روشی بسیار پیچیده استفاده کرده بود
الزاما روش های پیچیده راه حل های بدی نیستند :wink:

Behrouz_Rad
پنج شنبه 04 فروردین 1384, 23:48 عصر
در Form_Load مقدار پارامتر P خونده میشه و در 10 ضرب میشه که البته دوستون در اینجا خواستند که 20 تا رکورد نمایش داده بشه پس باشد در 20 ضرب کنند + تقسیم بر 20 در پروسیجر
و مثلا به شکل زیر رکوردها رو انتخاب کنند:


Select * From (Select Top 10 * From (Select Top " & CStr(CInt(MyParamURL * 10)) & " * From (Select * From Per_Tbl Order By StrSubID DESC)) Order By StrSubID) Order By StrSubID DESC

Behrouz_Rad
جمعه 05 فروردین 1384, 00:13 صبح
اصلا چیز واضحیه. خود مایکروسافت اعلام کرده که از DataSet برای پروژه های بزرگ استفاده نشه.
اون 10000000 خط رو با چند خط کد بنده مقایسه کنید و اصلا انتحانش کنید ببینید کدوم سریع تر به جواب می رسه.
رکوردها در چیزی قرار نیم گیرند که نگران به هدر رفتن حافظه باشیم.
تنها تعداد رکوردها در یک متغیر قرار می گیرند و بقیه ماجرا...............

titbasoft
جمعه 05 فروردین 1384, 00:35 صبح
فکر کنم در نهایت شما هم می خواهید به همون روشی که توی اون لینک بود اشاره کنید. (اونجا از dataset استفاده نشده و فقط گفته load زیادی میزاره).شاید اون تکه کد آخری به نظر زیاد بیاد ولی اگر با دقت بهش نگاه کنید می بینید که تقریبا همون چیزیه که شما می گید و 70 درصدش زلم زیمبا است.
(البته اگر بر فرض محال PK نداشته باشیم به مشکل می خوره)

اون 10000000 خط رو ...
فکر کنم دقت بیشتری می طلبه :موفق: :wink: با استفاده از همون n هزار خط می تونستید بر حقانیت حرفتون تاکید کنید :flower:

Behrouz_Rad
جمعه 05 فروردین 1384, 01:56 صبح
درسته. امیدوارم دوستمون به جوابشون رسیده باشند.. :wise1:

ealireza
جمعه 05 فروردین 1384, 11:51 صبح
درسته. امیدوارم دوستمون به جوابشون رسیده باشند.. :wise1:Behrouz_Rad جان دستت درد نکنه
منم دقیقا همین کارو کرده بودم
اما تنها اشکالی که با هاش داشتم این بود که
وقتی صفحات آخر انتخاب میشه خیلی خیلی سنگین میشد من دقیقا این کارو کردم


for x as integer 1 to pagenow*perpage
reader.Read()
next
بعد بقیه برنامه از اینجا شروع میشد ...

اگه میشه در باره


Select * From (Select Top 10 * From (Select Top " & CStr(CInt(MyParamURL * 10)) & " * From (Select * From Per_Tbl Order By StrSubID DESC)) Order By StrSubID) Order By StrSubID DESC بیشتر توضیح بدید
چرا اول Cint کردید بعد Cstr :گیج:

اگه میشه در باره این Sql Command بیشتر توضیح بدید :تشویق: :موفق:

با تشکر علیرضا

Behrouz_Rad
جمعه 05 فروردین 1384, 13:06 عصر
شما از DataReader استفاده نکن. اصلا نیازی بهش نداری. با اون چیزی که شما نوشتی که حافظه بیچاره.......

در مورد اون دستور SQL هم برای اینکه بتونیم مقدار پارامتر دریافت شده رو در عدد 10 ضرب کنیم، باید ابتدا به Integer تبدیل بشه (خیلی واضحه). مثل تابع VAL در VB.6.0 یا eVal در جاوا اسکریپت.
البته شما از کلاس Convert استفاده کن. Convert.ToInt32.
و در آخر هم چون دستور SQL ما از نوع رشته ای هست، نتیجه ضرب رو به مقدار رشته ای تبدیل کردم. شما از Convert.ToString استفاده کن.

برای اینکه متوجه بشید که این دستور SQL به چه شکل عمل می کنه، می تونید از داخلی ترین Select شروع کنی و به صورت نوشتاری پیاده سازیش کنید.
موفق باشید.

ealireza
جمعه 05 فروردین 1384, 20:00 عصر
شما از DataReader استفاده نکن. اصلا نیازی بهش نداری. با اون چیزی که شما نوشتی که حافظه بیچاره.......

در مورد اون دستور SQL هم برای اینکه بتونیم مقدار پارامتر دریافت شده رو در عدد 10 ضرب کنیم، باید ابتدا به Integer تبدیل بشه (خیلی واضحه). مثل تابع VAL در VB.6.0 یا eVal در جاوا اسکریپت.
البته شما از کلاس Convert استفاده کن. Convert.ToInt32.
و در آخر هم چون دستور SQL ما از نوع رشته ای هست، نتیجه ضرب رو به مقدار رشته ای تبدیل کردم. شما از Convert.ToString استفاده کن.

برای اینکه متوجه بشید که این دستور SQL به چه شکل عمل می کنه، می تونید از داخلی ترین Select شروع کنی و به صورت نوشتاری پیاده سازیش کنید.
موفق باشید.Behrouz_Rad جان من SQL Query شما رو امتحان کردم ازش اشکال گرفت
من با استفاده از یک Query اولین رکورد مربوط به مثلا (صفحه 2) 40 رکورد پیش رو گرفتم و بصورت زیر تعریف کردم



Select * from Tabel Where Id > " & LastID


ولی فکر کنم استفاده از ABSOLUTE باعث این میشه که خود SQL این کارو انجام بده و بار بیشتری روش بیفته ..

اگه میشه نگاه اون Query خودت بنداز که مشکلش رو حل کنی :mrgreen: که راحت بشه ازش استفاده کرد :sunglass:

اگه میشه بگو بجای READER از چی استفاده کنیم :گیج:
من تا حالا به جز READER از چیزی استفاده نکرده بودم ...
اگه میشه یه کد بزار :mrgreen: :موفق: :strange:


یک سوال فنی هم از شما و دیگران که حرفه ای هستند دارم
به نظر شما VB.net قوی تر هست یا #C مخصوصا برای Replace هاس سنگین ...


با تشکر علیرضا

Behrouz_Rad
جمعه 05 فروردین 1384, 21:34 عصر
بنده در وبلاگم از همون دستور Select ای که به شما دادم استفاده کردم. در حقیقت اون کد قسمتی از وبلاگ من بود و هیچ مشکلی هم نداره.
دستور SQL بنده رو باید بنا به جداول و فیلدهای خودتون تنظیم کنید.


گه میشه بگو بجای READER از چی استفاده کنیم گیج
من تا حالا به جز READER از چیزی استفاده نکرده بودم ...
شما متوجه توضیحات بنده نشدید! شما باید تعداد کل رکوردها رو استخراج کنید و بنا به تعداد اونها، لینک به صفحات مختلف بسازید. به عنوان مثال اگر 53 تا رکورد داریم و بخوایم که در هر صفحه 10 رکورد نمایش داده بشه، تعداد لینک ها 6 عدد خواهد بود. پیشنهاد بنده این بود که تعداد رکوردها رو با استفاده از یک دستور Select Count(*) From MyTable و اجرای فرمان Dim I As Int32 = MyCommand.ExecuteScalar به دست بیارید و ........


یک سوال فنی هم از شما و دیگران که حرفه ای هستند دارم
به نظر شما VB.net قوی تر هست یا #C مخصوصا برای Replace هاس سنگین ...
این سوال هیچ وقت جوابی نداره!
در Net Framework.، از آنجا که دستورات به زبان IL ترجمه می شوند، تعداد دستوراتی که ممکن است برای مثلا یک حلقه For که در دو زبان مختلف (مثلا VB.NET یا #C) مختلف نوشته شده اند برای تبدیل به زبان IL در این دو زبان متفاوت باشد، در پاره ای اوقات VB.NET و در مواقعی نیز #C برتری پیدا می کند.


اگه میشه یه کد بزار
User Control زیر که برای پیمایش صفحات ایجاد شده، توسط مدیریت سایت IranASP.NET نوشته شده که البته من با این کد موافق نیستم.

ealireza
شنبه 06 فروردین 1384, 02:37 صبح
بهروز جان من از یک Query استفاده کردم که خیلی راحت تر به نتیجه میرسه
روشی که من استفاده کردم فقط برای صفحه بندی میشه ازش استفاده کرد ...
برای مقادیری مثل Where و .. اصلا کار نمیکنه ..

مثلا برا SEARCH کار نمیکنه :( و فقط میتونه صفحه اولو نشون بده ..
اگر هم بخواهم همه رکورد ها رو بگیرم و یه جانگه دارم و کانکشن و ببندم که کار DataSet رو کردم :evil2:

کوییری شما رو هم اصلا از لحاظ صحیح بودن فرمان SQL ایراد میگیره


Select * From (Select * From [tabel] )
دقیقا اینو گفت ..


Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.

فکر نکنم بشه ...
ولی اگر میشه همین رو مثلا برای یک Tabel فرضی با نام [tabel] بگید

برا او مثال هم که از IranASP.NET به نظر من ازشون بعیده ..


با تشکر علیرضا

titbasoft
شنبه 06 فروردین 1384, 12:21 عصر
زمانی که در SQL دارید از sub-query استفاده می کنید حتما باید برای آن یک alias در نظر بگیرید.مثال:

Select * From (Select * From [tabel] ) as t1
:wink:

Behrouz_Rad
شنبه 06 فروردین 1384, 13:20 عصر
شما این دستور رو توی Query Analyzer وارد نکن!
باز هم تکرار می کنم: این دستور SQL هیچ مشکلی نداره و به راحتی جواب میده.
تمامی مسائل گفته شد.

End of My Job

Good Luck