ورود

View Full Version : مشکل در حذف تعداد زیادی از فیلدها در حلقه while



javad_h1383
یک شنبه 22 فروردین 1389, 18:12 عصر
دوستان اگه میتونید در زمینه حذف فیلدها بوسیله adodc به من کمک کنید کد زیر بعد از چند بار اجرا شدن در حلقه error میدهد

While (adop11b.Recordset.RecordCount > 0)
adop11b.Recordset.MoveFirst
adop11b.Recordset.Delete
adop11b.Refresh
Wend
من میخواهم بوسیله این کد پایگاه داده خالی شود
اطلاعات من در سطح مبتدی است

xxxxx_xxxxx
یک شنبه 22 فروردین 1389, 19:12 عصر
سلام،
دستورات شما به طور طبیعی هیچ مشکلی ندارند. اما به کاری انجام میدید دقت کنید!
شما در درون حلقه ابتدا Cursor رو به ابتدای Recordset منتقل می کنید. سپس یک رکورد از آن را حذف می کنید (رکورد اول) و بعد Recordset را Refresh می کنید. Refresh کردن Recordset باعث میشه تا Cursor به ابتدای Recordset منتقل بشه و Recordcount به روز بشه. این دو کار کمی زمانبر هستند. (چندصد میلی ثانیه تا چند ثانیه) در همین حین که Recordset میخواد Refresh بشه، دوباره شرط حلقه بررسی میشه، اما چون هنوز عمل Refresh به طور کامل انجام نشده پس RecordCount مقدار سابق رو داره. پس این کار باعث میشه تا دستورات داخل حلقه حتی در شرایطی که RecordCount برابر 0 باشد اجرا بشوند.

در کل کاری که شما انجام دادی به چند دلیل اصلاً بهینه نیست.
اول اینکه به ازای هر حذفی که انجام میشه، Cursor دو بار روی Recordset حرکت میکنه.
دوم اینکه متد Refresh عملاً هزینه بر هست و زمان زیادی رو بیهوده تلف می کنه.

اگر بین دستورات درون حلقه دستور DoEvents رو اضافه کنید، ممکن هست که دیگه Error دریافت نکنید. اما به بهینه شدن دستورات کمکی نخواهد کرد.

در نهایت توصیه میشه برای این کارهای سنگین و زمانبر از دستورات SQL استفاده کنید. دستور SQL رو دورن RecordSource قرار میدی و بعد Adodc رو Refresh می کنید.
جستجو کنید: Adodc ، Delete From

محسن شامحمدی
دوشنبه 23 فروردین 1389, 16:30 عصر
دوست عزیز با این کار شما یک کار الکی کردید مثل این می مونه که به جای اینکه یک جمله رو به دوستتون اس ام اس کنید خودتون بلند شید تا یک شهر دیگه تا همون جمله رو بگید(تا این حد!!!!:کف:)
شما اگر این کارو بکنی سرعت برنامت ده برابر چه چی بگم 100 برابر می شه
از روش زیر استفاده کن


ado1.recordsource="delete * from users"
ado1.refresh
اینطوری در عرض کمتز از 1 ثانیه کل محتویات این جدول پاک می شه