PDA

View Full Version : دسترسی به رکورد بعدی جدول (فوری)



sm
یک شنبه 18 مرداد 1383, 19:45 عصر
باسلام به دوستان عزیز
یه بانک دارم که جدولهای گردن کلفتی داره!!!!!
توی VB.NET می خوام روی رکوردها حرکت کنم وبه رکورد قبل و بعد از رکورد جاری بوسیله کلیدی دسترسی داشته باشم که برای اینکار اومدم یه StoredProcedure نوشتم که مثلا برای رفتن به رکورد بعدی مینمم عدد بزرگتر از رکورد جدید رو که کلید هست پیدا می کنه
با اینکار یه مشکل بوجود می آید و اونم اینه که چون تعداد رکوردهای جدول زیاده (250000رکورد) یه کمی زمانبر است
البته زمانبر بودن ایجوریه که اگه در ابتدای جدول باشیم و به رکورد بعدی برویم چون تعداد اونها زیاده و می خواد مینیمم اونها رو برگردونه زمان زیادی می بره درصورتیکه اگه ابتدای جدول باشیم (رکوردهای 50تا500)برای رفتن به رکورد قبلی اصلا زمانی صرف نمی شه
می خواستم از دوستان کمک بگیرم ببینم آیا می شه با یه دستور ساده به رکورد قبل یا بعد از رکورد جاری دسترسی پیدا کرد؟
ممنون
درضمن بفرض آنکه دادها مرتب شده باشند و با Stored Procedure ونکته دیگر اینکه چون برنامه تحت شبکه می باشد باید هرلحظه داده ها را از بانک خواند و نمی توان یکبار آنها را Fill کرد و روی آنها جستجو نمود.......
ممنون میشم درصورت امکان زود پاسخ بدین

AminSobati
دوشنبه 19 مرداد 1383, 00:22 صبح
دوست عزیز،
من دو حدس میتوانم بزنم:
یکی اینکه شما روی فیلدی که Min یا Max میگیرید، ایندکس نساخته اید. ولی با توجه به اینکه گفته شد این فیلد کلیدی است، پس Primary Key بوده و ایندکس دارد. پس حدس من غلط است.
دوم اینکه شما برای مثلا انتخاب رکورد بعدی، کل رکوردهای بعد از اون رو انتخاب میکنید و بعد کوچکترین رو برمیدارید. اما به اعتقاد من Procedure که برای گرفتن رکورد بعدی استفاده میشود، بهتر است چیزی شبیه به این باشد:


Create Proc MyPrco1 @KeyValue as int as
declare @NextKey int
select @NextKey=min(KeyColumn) from MyBigTable where KeyColumn>@KeyValue

select * from MyBigTable where KeyColumn=@NextKey


ضمنا شما به دلیل تحت شبکه بودن برنامه، مجبور به خواندن رکوردها به طور پی در پی از بانک اطلاعاتی نیستید. میتونید مثلا در دسته های 50تایی از بانک بخوانید، موقع برگرداندن رکوردهای ویراش شده کنترل کنید که هر رکورد از زمان آخرین خوانده شدن، توسط کاربر دیگری ویرایش شده یا نه.
البته امیدوارم هدف شما رو درست متوجه شده باشم

Mohammad S
دوشنبه 19 مرداد 1383, 01:15 صبح
یعنی توی VB.NET دستوری مثل ADOTable1.Next نداره! :?:

AminSobati
دوشنبه 19 مرداد 1383, 01:44 صبح
چرا محمد جان
ولی موضوع این هست که در بعضی شرایط خاص از این روشها ترجیح میدن که استفاده نشه به دلایلی.
امکانی که شما اشاره کردین در ADO از قدیم برای Recordset وجود داشته چه برسه در ADO.NET اما در درجه اول سعی میکنیم این دوستمون الگوریتم کار خودشون رو بهتر عیب یابی کنن...

hmm
دوشنبه 19 مرداد 1383, 07:02 صبح
یکبار من برای دات نت پیدا کردم که به رکورد بعدی میرفت الان یادم نیست میگردم پیدا میکنم
ولی اگه شما نمیخواهید که عمل برگشت رو انجام بدید از datareader استفاده کنید.

JavanSoft
دوشنبه 19 مرداد 1383, 07:53 صبح
اگر پایگاهتان تحت SqlServer است با Cursor مشکل را حل کنید

AminSobati
دوشنبه 19 مرداد 1383, 10:09 صبح
استفاده از Cursor دارای Cost بالایی هستش و فقط در شرایطی که واقعا ناچار هستیم باید استفاده کنیم. ضمنا Cursor در حافظه سرور تشکیل میشه و نمیشه از کلاینت یک به یک رکوردها رو از اون فراخوانی کرد. در این مورد با تکنیکهای بسیار ساده تری مشکل رو میشه حل کرد. مثلا استفاده از Dataset

sm
یک شنبه 25 مرداد 1383, 00:16 صبح
ممنون از دوستان
مشکلم حل شد
خیلی خیلی ممنون

AminSobati
یک شنبه 25 مرداد 1383, 19:30 عصر
:) :تشویق:

hmm
دوشنبه 26 مرداد 1383, 07:06 صبح
در ADO از قدیم برای Recordset وجود داشته چه برسه در ADO.NET
میشه بفرمایید چیه؟

AminSobati
دوشنبه 26 مرداد 1383, 11:33 صبح
در ADO تقریبا از بدو تولدش یک پراپرتی برای Recordset وجود داشته به اسم CacheSize.
اگر چه توسط دو متد MoveNext و MovePrevious امکان جابجایی بین رکوردها در Recordset وجود داره ولی CacheSize تاثیر جالبی بر این کار داره. به این ترتیب که اگر فرضا مقدار CacheSize رو به 10 تنظیم کنیم، ADO به محض انجام Query فقط 10 رکورد از نتیجه Query رو در Local Memoery ذخیره(Cache) میکنه. زمانی که کاربر بین این 10 رکورد در Recordset حرکت میکنه و از رکورد دهم به رکورد یازدهم میخواد بره، ADO اقدام به آوردن 10 رکورد بعدی میکنه و به همین ترتیب برای ادامه کار عمل میکنه.
CacheSize کمک میکنه که اولا حافظه کلایت (Local Memory) یکباره بر اثر بزرگ بودن Query، اشغال نشه ثانیا در سبک کردن بار ترافیک شبکه هم تاثیر مثبت داره چرا که Download کردن یکباره نتیجه Query به ویژه زمانی که حجیم هستش باعث کند کردن شبکه میشه. ولی بوسیله تنظیم CacheSize، فقط رکوردها در زمانی که مورد نیاز هستند Download میشن.

موفق باشین

hmm
دوشنبه 26 مرداد 1383, 12:29 عصر
منظورم در ado.net بود روش پیمایش دیتا سورس رو بفرمایید.

AminSobati
دوشنبه 26 مرداد 1383, 20:40 عصر
یک Sample خوب در این فایل Zip هستش، خوشبختانه توضیح هم داده برای هر سطر از برنامه. امیدوارم کمکتون کنه.
موفق باشین

hmm
سه شنبه 27 مرداد 1383, 08:58 صبح
ممنون

AminSobati
سه شنبه 27 مرداد 1383, 09:12 صبح
:)