• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

يه MDB رو با چه کدی میشه Compact And Repair Database کرد ؟

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
سلام
يه MDB رو با چه کدی میشه Compact And Repair Database کرد ؟

قبلا دیده بودم اما الان هر چی می گردم پیداش نمی کنم !
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
اگر كدي كه قبلا ديده بودي اينه DoCmd.RunCommand acCmdCompactDatabase بدون كه كار نميكنه و راهش اين نيست.
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
درستش چیه ؟
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
بايد از CommandBars استفاده كني - Help خود Access رو نگاه كن كه طرز كارش رو توضيح داده - متوجه نشدي خبر بده
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
دوست من
لطف کن چند خط بنویس وخلاص
البته یه چیزایی گیر آوردم . ولی کامل نیست . یعنی Compact And Repair Database میکنه ولی نتیجه رو تو یه فایل دیگه ذخیره میکنه .

تو help اکسس هم گشتم . کدی راجع به این قضیه نبود
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
كدش يك خط بيشتر نيست - ولي ورژنهاي مختلف با هم فرق ميكنه - اگر گفتم help رو نگاه كن واسه اين بود كه بخاطر كوچكترين تفاوتي در ورژن ممكنه اين كد كار نكنه:
CommandBars("Menu Bar").Controls("Tools").Controls("Database utilities").Controls("Compact and repair database...").accDoDefaultAction​
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
اگه منظورت تو ویژوال بیسیکه کدش اینه:

DBEngine.CompactDatabase App.Path & "\Base.mdb", App.Path & "\db\Base.mdb"

و اگه دیتابیست پسورد داره:

DBEngine.CompactDatabase App.Path & "\Base.mdb", App.Path & "\db\Base.mdb", , , ";pwd=yourpassword"

به همین سادگی!

این کدها برای DAO هستش و اگه بخوای با ADO اين كارو انجام بدي بايد ServicePack6 ويژوال استوديو رو حتمآ نصب كرده باشي تا با استفاده از Microsoft.Jet.OLEDB.4.0 و كتابخانه JRO اين كارو بكنه چون Microsoft.Jet.OLEDB.3.5.1 قابليت فشرده سازي رو تو ADO نداره.

کدش هم اینه:

Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\nwind2.mdb;Jet OLEDB:Database Password=test", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\abbc2.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB:Database Password=test"
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
به نقل از mostafa_gm :
اگه منظورت تو ویژوال بیسیکه کدش اینه:

DBEngine.CompactDatabase App.Path & "\Base.mdb", App.Path & "\db\Base.mdb"

و اگه دیتابیست پسورد داره:

DBEngine.CompactDatabase App.Path & "\Base.mdb", App.Path & "\db\Base.mdb", , , ";pwd=yourpassword"

به همین سادگی!

این کدها برای DAO هستش و اگه بخوای با ADO اين كارو انجام بدي بايد ServicePack6 ويژوال استوديو رو حتمآ نصب كرده باشي تا با استفاده از Microsoft.Jet.OLEDB.4.0 و كتابخانه JRO اين كارو بكنه چون Microsoft.Jet.OLEDB.3.5.1 قابليت فشرده سازي رو تو ADO نداره.

کدش هم اینه:

Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\nwind2.mdb;Jet OLEDB:Database Password=test", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\abbc2.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB:Database Password=test"

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

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
از همه شما ممنونم
. حقیقتش هنوز فرصت تست کردنش رو پیدا نکردم
بعد از یکمی سر و کله زدن نتیجه رو مینویسم
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
سلام
ServicePack6 را نصب کردم . ولی کتابخانه JRO به ریفرنسهای وی بی اضاف نشد !!
ولی با این کد جواب گرفتم

Dim jro As JetEngine
Set jro = New JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\nwind2.mdb;Jet OLEDB : Database Password=test", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\abbc2.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB : Database Password=test

مشکل اینجاست که : میخوام سورس با تارگت یکی باشه .
تو کد بالا اگر هر دو مسیر رو به سورس بدیم با پیغام خطا مواجه میشیم !

البته فکر این رو هم کردم که قبل از اجرای کد یه تغییر نام بدم بعد کد رو اجرا کنم . این راه حل رو بعنوان آخرین چاره در نظر گرفتم .

با اینحال اگه فکر دیگه ای دارید ممنون میشم .
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
تنها راهش همینه:

jro.CompactDatabase "Data Source=.\NorthWind.mdb;", _
"Data Source=.\NewNorthWind.mdb;" & _
"Jet OLEDB:Database Password=password"

' Delete the original database
Kill ".\NorthWind.mdb"

' Rename the file back to the original name
Name ".\NewNorthWind.mdb" As ".\NorthWind.mdb"

آخه این واسه ADO نبوده توش چپوندن اينطوري شده.
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
51|203|140|233|28|234|207|220|28|133|205|234|207|233|28|204|205|226|28|204|205|233|28|225|195|241|221|231|226|232|28|156|225|36|28|133|205|241|203|233|28|50|28|241|225|36|205|234|208|36|223|220|223|202|224|36|198|213|28|215|205|203|215|36|224|211|195|213|233|36|187| یعنی اگه وسط پروسه برق بره فایلمون که پریده . یه روش مطمئن تر سراغ نداری ؟
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
به نقل از Piter1356 :
یعنی اگه وسط پروسه برق بره فایلمون که پریده . یه روش مطمئن تر سراغ نداری ؟
اين موضوع پريدن برق در هر لحظه اي ممكنه اتفاق و كلا MDB خيلي راحت ممكنه خراب بشه حتي اگر هم برق نره - بعنوان مثال در محيط شبكه كه بيش از يك كاربر باهاش كار ميكني اگر يكي اتصال شبكه اش در حين نوشتن اطلاعات قطع و وصل بشه در كار ديگران هم اخلال ايجاد ميكنه و ممكنه برنامه ACCESS روي همه كامپيوترها قفل كنه. در اينحالت اين امكان هست كه بعد از ريستارت كامپيوترها يا ACCESS اطلاعات شما Corrupt بشه كه ممكنه حتي با Compact & Restore هم برنگرده يا در صورت برگشت كامل نباشه و ركوردهايي رو از دست بدي (معمولا آخرين ركورد ولي حسابي در كار نيست و از همه بدتر نميفهمين چه ركوردهايي پريده!)
براي دچار نشدن به اين مصائب اگر در شبكه كار ميكني و ويندوز سرور هم داري بايد از SQL Server استفاده كني و اگر WorkGroup هست يا كامپيوتر تكي بايد MSDE رو كه معمولا همراه Office نصب كني (و البته ديسكها هم بايد NTFS فرمت بشن). البته تفاوتهايي بخصوص در تعريف جداول و كدنويسي VBA بين ديتابيس SQL و MDB در محيط Access وجود داره كه بمرور بهش مسلط ميشي!

ضمنا روش استفاده از CommandBars رو اگر نتونستي جواب بگيري مربوط به ورژن Office ممكنه باشه و مطمنئترين راه هست چون دقيقا معادل اجراي دستور از منو است.
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
کد:
CommandBars("Menu Bar").Controls("Tools").Controls("Database utilities").Controls("Compact and repair database...").accDoDefaultAction

این کد زمانی عمل میکنه که Access رو نصب کرده باشیم . من فقط از بانک mdb استفاده می کنم . حتی اگر access رو سیستم نباشه برنامه کار میکنه . حالا میخوام در صورتی که access هم نصب نبود این فرمان بدون مشکل کار کنه

واقعیت اینه که من یه برنامه برای جایی نوشتم . بانکش mdb یه . چند وقت پیش یه سری زدم ببینم چه خبره . دیدم تنها مساله ای که وجود داره زیاد شدن بی حساب کتاب حجم فایل mdb یه .

حالا اگه فایل توسط کنترلهای adodc باز باشه باز هم میتونیم کامپکت اند ریپیرش کنیم یا نه ؟
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
به نقل از Piter1356 :
کد:
CommandBars("Menu Bar").Controls("Tools").Controls("Database utilities").Controls("Compact and repair database...").accDoDefaultAction

این کد زمانی عمل میکنه که Access رو نصب کرده باشیم . من فقط از بانک mdb استفاده می کنم . حتی اگر access رو سیستم نباشه برنامه کار میکنه . حالا میخوام در صورتی که access هم نصب نبود این فرمان بدون مشکل کار کنه

واقعیت اینه که من یه برنامه برای جایی نوشتم . بانکش mdb یه . چند وقت پیش یه سری زدم ببینم چه خبره . دیدم تنها مساله ای که وجود داره زیاد شدن بی حساب کتاب حجم فایل mdb یه .

حالا اگه فایل توسط کنترلهای adodc باز باشه باز هم میتونیم کامپکت اند ریپیرش کنیم یا نه ؟

خوب زودتر ميگفتي!
افزايش بقول خودت بيحساب كتاب حجم MDB كاملا طبيعيه! ولي من روشي غير از محيط Access براي Compact & Repair بلد نيستم و نميتونم در مورد روش اينكار در فرضا VB اظهار نظر كنم! بخصوص زماني كه ديتابيس كانكشن باز داشته باشه.
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
من خودم يه فايل جدا براي اين كار درست كردم كه كاربر هر وقت خواست backup بگيره دستي ديتابيس رو compact كنه يا اينكه هر وقت حجم اون خيلي زياد شد اين كارو بكنه.
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
به نقل از mostafa_gm :
من خودم يه فايل جدا براي اين كار درست كردم كه كاربر هر وقت خواست backup بگيره دستي ديتابيس رو compact كنه يا اينكه هر وقت حجم اون خيلي زياد شد اين كارو بكنه.

اینجوری که آبروریزیه . :blink:

آخه نمیگن اگه قراره دستی کامپکت اند ریپیر کنیم برنامه چیکارس ؟
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
به نقل از Piter1356 :
اینجوری که آبروریزیه . :blink:

آخه نمیگن اگه قراره دستی کامپکت اند ریپیر کنیم برنامه چیکارس ؟
متاسفانه مشكليه كه وجود داره، كاريش هم نميشه كرد اگه ميخواي داخل برنامه اين كار انجام بشه در حالي كه دیتابیس بازه باید از DAO استفاده کنی.
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
به نقل از mostafa_gm :
متاسفانه مشكليه كه وجود داره، كاريش هم نميشه كرد اگه ميخواي داخل برنامه اين كار انجام بشه در حالي كه دیتابیس بازه باید از DAO استفاده کنی.

با dao یا adodc میشه ؟
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
با DAO بله :

DBEngine.CompactDatabase App.Path & "\Base.mdb", App.Path & "\db\Base.mdb", , , ";pwd=yourpasssword"

ADODB و ADODC هم فرقی با هم ندارند.
 
بالا