PDA

View Full Version : پاك كردن ركورد هاي ديتابيس اكسس و حجم ديتابيس



UpgradeVB6Code
چهارشنبه 01 خرداد 1387, 20:50 عصر
سلام
نميدونم چرا وقتي ركورد هاي ديتابيس رو پاك ميكنم سايزش به سايز اوليه بر نميگرده ؟؟؟ :متعجب:

vbhamed
پنج شنبه 02 خرداد 1387, 00:05 صبح
سلام

ساختار فايلهاي ديتابيس سگمنتي هست
هر سگمنت 65kb هست كه البته تو اكسس 2003 از 96kb استفاده ميشه
اين يعني اينكه سايز فايل شما در ابتدا 65 كيلوبايت هست و اين سايز براي تعريف جداول و ارتباطات استفاده ميشه
مقداري هم فضا ممكنه اضافه بياد كه براي ديتاي جداول مصرف ميشه
پس تا موقعي كه از اين فضاهاي خالي استفاده نشه، سايز فايل حتي با ورود اطلاعات، بزرگ نميشه
اما فرض كنيم دقيقا 65 كيلوبايت مصرف شد، حالا اگر حتي 1 بايت هم اضافه كنيم، سايز بانك به اندازه يك سگمنت بزرگ ميشه و باز تا پر شدنش ديگه بزرگ نميشه
مثل اينكه داريد املا مي نويسيد و اگر كاغذتون پر بشه، يك كاغذ كامل جديد استفاده مي كنيد


حالا اگر اطلاعاتي از جدول را پاك كنيم، به دليل ساختار داخلي ذخيره اطلاعات و جهت افزايش سرعت، اطلاعات واقعا پاك نميشه و فقط علامت حذف شده مي خوره، يعني ركوردها وجود دارند ولي به عنوان پاك شده در نظر گرفته ميشه

اما اگر ديتابيس رو كامپكت كنيم، اطلاعات علامت خورده واقعا حذف ميشن و سايز بانك كوچك ميشه

ولي اگر قرار باشه با هر بار حذف اطلاعات، بانك كامپكت هم بشه سرعت برنامه خيلي پايين مياد

واسه همين اگر سايز بانك خيلي بزرگ نيست بهتره ابتداي اجراي برنامه اون رو كامپكت كنيم يا هنگام خروج
ولي اگر سايز خيلي بزرگ هست يا اين كار رو به انتخاب كاربر بزاريم يا به صورت اتوماتيك در مواقع بيكاري كامپيوتر


براي كامپكت كردن هم ميشه از دستورات زير استفاده كرد



On Error Resume Next

dao.CompactDatabase "c:\test.mdb", "c:\testCompact.mdb"

If Dir$("c:\testCompact.mdb") <> "" Then

If FileLen("c:\testCompact.mdb") > 1000 Then

Kill "c:\test.mdb"
Name "c:\testCompact.mdb" As "c:\test.mdb"

End If

End If



براي اجراي دستورات بالا حتما بايد بانك بسته باشه، يعني هيچ كنترل ديتايي اون رو باز نكرده باشه
تو دستورات بالا، ابتدا بانك فشرده ميشه و سپس اگر فايل فشرده بدون مشكل ساخته شده بود و سايزش هم 0 نبود (بيشتر از 1000 براي اطمينان) در اينصورت بانك اصلي پاك ميشه و بانك فشرده جايگزين اون ميشه