المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : إصلاح وضغط قاعدة البيانات MS Access


kachwahed
03-01-2010, 08:12 PM
بسم الله الرحمن الرحيم

محرك قواعد البيانات Microsoft Access ضمن مجموعة برامج المكتبية Microsoft Office الشهيرة، أحد أسهل مخدمات قواعد البيانات، ومما زاد استخدامه شيوعا لدى المبرمجين كون المحرك ADO مضمن مع إصدارات Windows، حيث هذا المحرك هو الأنسب والأكثر استخداما للاتصال مع محركات Microsoft.

باختصار... لست بحاجة لتثبيت MS Office إذا أردت أن تستخدم قاعدة بيانات Access لأن المحرك مضمن مع إصدار Windows الحديثة.

وبالمقابل فإن من أسوأ عيوب قاعدة بيانات Access أنها تحتاج لصيانة باستمرار، حيث يزداد حجمها مع كل استخدام جراء البيانات الداخلية المتدفقة (Caching, Temporary buffering). ومع زيادة الحجم تزداد مدة فتح قاعدة البيانات ويتضخم حجم النسخة الاحتياطية Backup، والأفظع من ذلك أنك قد تأتي إلى فتح قاعدة البيانات فتصادفك رسالة "مرعبة" تخبرك بأن قاعدة البيانات معطوبة لكن يمكن إصلاحها، والأفظع منه أنك عندما تأتي إلى إصلاحها قد تضيع بعد البيانات (حقول مشوهة، قيود حذفت، ....)، هذا ناهيك عن عدم الاستقرار عند العمل على الشبكات...
* مثال رسالة Access تقترح إصلاح قاعدة البيانات:
http://www.datanumen.com/aar/errors/images/error2239_1.gif

* هنا Access ينكر ملفات قاعدة يباناته ويتبرأ منها :):
http://www.datanumen.com/aar/errors/images/error2239_2.gif

http://www.datanumen.com/aar/errors/images/error2239_3.gif

الحل الأمثل لتفادي فيلم الرعب السابق، هو تنظيف (أو ضغط) قاعدة البيانات باستمرار أو ما يعرف بالقيام بـ Compact، وبذلك لن نضطر لإصلاح قاعدة البيانات لاحقا.

يمكن عمل ذلك من خلال MS Access كما يلي:
Tools – Database Utilities – Compact and Repair Database
أو في إصدار Access 2007 تقريبا هكذا:
File - Manage - Compact and Repair Database

للقيام بذلك من خلال دلفي هناك عدة طرق كلها تصب في نهر واحد:
- الطريقة الأولى: عبر مزود قواعد البيانات JRO.JetEngine: هذه الدالة شائعة في النت، قمت ببعض التعديلات عليها.
uses
ComObj

function CompactAndRepair(DB, Password: string) : boolean;
const
sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password="%s"';
var
v: OLEvariant;
begin { CompactAndRepair }
Result := True;
try
v := CreateOLEObject('JRO.JetEngine');
try
v.CompactDatabase(Format(sProvider, [DB, Password]), Format(sProvider, [DB + 'x', Password]));
if FileExists(DB + 'x') then begin
DeleteFile(DB);
RenameFile(DB + 'x', DB)
end;
finally
v := Unassigned
end; { try }
except
Result := False
end; { try }
end; { CompactAndRepair }
يأخذ هذا التابع معلمتين DB هو المسار الكامل لملف قاعدة بيانات Access و Password كلمة المرور لها.
ويعيد ناتج Boolean بقيمة True في حالة النجاح أو False عند الفشل.
التابعين الآتيين على نفس النسق.

أضفت لها Password والشرط:
if FileExists(DB + 'x') then begin
برأيي أن التحقق من وجود الملف في هذه مثل الحالات ضروري جدا...
لا تدري ما الذي سيحصل !؟ وعدم إصلاح قاعدة البيانات خير من حذفها بالكامل!
يتبع...

kachwahed
03-01-2010, 08:37 PM
-الطريقة الثانية: باستخدام مكتبة من النظام JRO_TLB، يجب تثبيتها أولا كما يلي:
Project – Import Type Library
ثم اختر “Microsoft Jet and Replication Objects 2.1 Library”
أو في نسخ دلفي الحديثة من Component ثم Install Component ثم اختر Import Library... الخ.
Uses
JRO_TLB;

function CompactAndRepair(DB, Password: String): Boolean;
const
sProvider = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password="%s"';
var
oJetEng : JetEngine;
begin
try
oJetEng := CoJetEngine.Create;
try
oJetEng.CompactDatabase(Format(sProvider, [DB, Password]),Format(sProvider, [DB + 'x', Password]));
if FileExists(DB + 'x') then begin
DeleteFile(DB);
RenameFile(DB + 'x', DB)
end;
Result := True;
finally
FreeAndNil(oJetEng);
end;
except
Result := False;
end;
end;


- الطريقة الثالثة: من خلال DAO.DBEngine دون استخدام مكتبة خاصة، هذه الطريقة مناسبة لنسخ دلفي السابقة التي لا تحتوي على مكونات ADO
لكن يجب التحقق من نسخة DAO.DBEngine المثبتة 3.5 أو 3.6

function CompactAndRepair(DB: String):Boolean;
var
dao: OLEVariant;
begin
try
//May be version DAO.DBEngine.35 or other...
dao := CreateOleObject('DAO.DBEngine.36');
try
dao.CompactDatabase(DB ,DB + 'x');
if FileExists(DB + 'x') then begin
DeleteFile(DB);
RenameFile(DB + 'x', DB)
end;
Result := True;
finally
dao := Unassigned;
end;
except
Result := False;
end;
end;

هذه الأخيرة ليس فيها Password.

لكن متى يجب ضغط (Compact) قاعدة البيانات ؟
أعتقد أن أحسن موعد هو قبل غلق البرنامج، وهذا خيار في MS Access. أو سؤال المستخدم إذا كان أهلا لذلك. في انتظار ما عند الخبراء.

تنبيه هام:
- قبل استخدام أي من هذه التوابع يجب غلق أي اتصال مع قاعدة البيانات، بعبارة أخرى الضغط يتم على قاعدة البيانات بشكل Exclusive. يتم ذلك بشيء مثل:
ADOConnection1.Close;
if CompactAndRepair(DatabaseName, DatabasePassword) then
ShowMessage('database compact successfully');
ADOTable1.Open;
ملاحظة: يمكن القيام بذلك من خلال سطر أوامر مضمن مع MS Access بهذا الشكل:
"%programfiles%\Microsoft Office\Office12\msaccess.exe" /compact *.mdb
ويمكن تطبيق هذا السطر من دلفي بـ ShellExecute مثلا.

في المرفقات مثال باستخدام DAO.DBEngine مرفق بالمصدر.
في انتظار آرائكم إثراءا للموضوع. تحياتي.

AL-MOB4RM3G
04-01-2010, 09:30 AM
جميل جداً اخي كاشواحد,, :laugh:

لكن متى يجب ضغط (Compact) قاعدة البيانات ؟
أعتقد أن أحسن موعد هو قبل غلق البرنامج، وهذا خيار في MS Access. أو سؤال المستخدم إذا كان أهلا لذلك. في انتظار ما عند الخبراء.

هل افهم من هذا انه يجب عمل ضغط للقآعدة بعد كل استخدآم ؟
وكيف تعد هذه القآعدة قويّة ان كانت تحتاج الى ضغط بعد كل استخدام ؟

في الحقيقة موضوع جميل, وانا في الحقيقة احب هذا القآعدة لسهولتها, لكن ربما علي التّخلّي عنها قريبا,

بارك الله لك وجزآك الله كل خير,:bye1:

issamdnn
04-01-2010, 01:54 PM
الله يعطيك ألف عافية
الحقيقة موضوع جميل جداً ويستحق التقدير . وخصوصاً أني دائم الإستخدام لقواعد بيانات ال MS Access .

شكراً مجدداً.

kachwahed
04-01-2010, 10:17 PM
هل افهم من هذا انه يجب عمل ضغط للقآعدة بعد كل استخدآم ؟
لا أقول يجب بعد كل استخدام... لكن ينبغي ألا تغفل عليها حتى تشاهد فيلم رعب حقيقي :D
التنظيف يكون بشكل دوري (شهريا، أسبوعيا، يوميا...) حسب الحاجة وحسب الاستخدام.

وكيف تعد هذه القآعدة قويّة ان كانت تحتاج الى ضغط بعد كل استخدام ؟
نظرية :D:
إذا افترضنا أن أحسن وسيلة نقل هي الطائرة مثلا ... لأنها أسرع من السيارة...
فهل سنركب الطائرة عوضا عن السيارة للذهاب إلى السوق لأنها أحسن وأسرع وسيلة نقل !!!؟
... كل شيء له استخدامه في نطاق معين...
Microsoft لا زالت تطور MS Access وقد أصدرت نسخة Office 2010
... وفي نفس الوقت لا زالت تطور SQL Server ولم تقل: نتوقف عن تطوير Access مادمنا نطور SQL Server !
وقس على ذلك باقي محركات قواعد البيانات ... لكل عيوب ومميزات ... وما تربحه من جهة قد تخسر لأجله من جهة أخرى
وما عليك إلا الموازنة بحسب ما تحتاج... لأجل أن تخسر أقل شيء مقابل أكبر ربح ممكن.
والله أعلم.
بارك الله لك أخي issamdnn، تشجيعك يدفعني للمزيد.

AL-MOB4RM3G
05-01-2010, 05:17 PM
لا أقول يجب بعد كل استخدام... لكن ينبغي ألا تغفل عليها حتى تشاهد فيلم رعب حقيقي
التنظيف يكون بشكل دوري (شهريا، أسبوعيا، يوميا...) حسب الحاجة وحسب الاستخدام.

طيب جميل اخي الكريم,
ومثآل السيآرة و الطآئرة وآضح ايضى ولله الحمد,

اذا نحتآج موضوع يوضح لنا متى نستخدم اي قآعدة حتى لا نجد انفسنا في فيلم الرعب الذي تتحدث عنه,,:unsure:

بارك الله لك اخي الكريم,

kachwahed
05-01-2010, 07:50 PM
فيلم الرعب الذي تتحدث عنه,,
في بعض الأحيان حتى Access نفسه لن يستطيع إصلاحها:
http://www.datanumen.com/aar/errors/database-needs-repaired.htm
إقرأ هذا جيدا:
http://office.microsoft.com/en-us/access/HA010345701033.aspx?pid=CH063648701033
http://office.microsoft.com/en-us/access/HP051874491033.aspx
لأجل ذلك وجدت الكثير من البرامج لإصلاح قاعدة بيانات Access
اذا نحتآج موضوع يوضح لنا متى نستخدم اي قآعدة
هذا أتركه للخبراء :).