03-01-2010, 08:12 PM (آخر تعديل لهذه المشاركة: 17-01-2010, 09:50 PM بواسطة kachwahed.)
بسم الله الرحمن الرحيم
محرك قواعد البيانات Microsoft Access ضمن مجموعة برامج المكتبية Microsoft Office الشهيرة، أحد أسهل مخدمات قواعد البيانات، ومما زاد استخدامه شيوعا لدى المبرمجين كون المحرك ADO مضمن مع إصدارات Windows، حيث هذا المحرك هو الأنسب والأكثر استخداما للاتصال مع محركات Microsoft.
باختصار... لست بحاجة لتثبيت MS Office إذا أردت أن تستخدم قاعدة بيانات Access لأن المحرك مضمن مع إصدار Windows الحديثة.
وبالمقابل فإن من أسوأ عيوب قاعدة بيانات Access أنها تحتاج لصيانة باستمرار، حيث يزداد حجمها مع كل استخدام جراء البيانات الداخلية المتدفقة (Caching, Temporary buffering). ومع زيادة الحجم تزداد مدة فتح قاعدة البيانات ويتضخم حجم النسخة الاحتياطية Backup، والأفظع من ذلك أنك قد تأتي إلى فتح قاعدة البيانات فتصادفك رسالة "مرعبة" تخبرك بأن قاعدة البيانات معطوبة لكن يمكن إصلاحها، والأفظع منه أنك عندما تأتي إلى إصلاحها قد تضيع بعد البيانات (حقول مشوهة، قيود حذفت، ....)، هذا ناهيك عن عدم الاستقرار عند العمل على الشبكات...
* مثال رسالة Access تقترح إصلاح قاعدة البيانات:
* هنا Access ينكر ملفات قاعدة يباناته ويتبرأ منها :
الحل الأمثل لتفادي فيلم الرعب السابق، هو تنظيف (أو ضغط) قاعدة البيانات باستمرار أو ما يعرف بالقيام بـ Compact، وبذلك لن نضطر لإصلاح قاعدة البيانات لاحقا.
يمكن عمل ذلك من خلال MS Access كما يلي:
Tools – Database Utilities – Compact and Repair Database
أو في إصدار Access 2007 تقريبا هكذا:
File - Manage - Compact and Repair Database
للقيام بذلك من خلال دلفي هناك عدة طرق كلها تصب في نهر واحد:
- الطريقة الأولى: عبر مزود قواعد البيانات JRO.JetEngine: هذه الدالة شائعة في النت، قمت ببعض التعديلات عليها.
PHP كود :
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
برأيي أن التحقق من وجود الملف في هذه مثل الحالات ضروري جدا...
لا تدري ما الذي سيحصل !؟ وعدم إصلاح قاعدة البيانات خير من حذفها بالكامل!
يتبع...
03-01-2010, 08:37 PM (آخر تعديل لهذه المشاركة: 17-01-2010, 11:39 PM بواسطة kachwahed.)
-الطريقة الثانية: باستخدام مكتبة من النظام JRO_TLB، يجب تثبيتها أولا كما يلي:
Project – Import Type Library
ثم اختر “Microsoft Jet and Replication Objects 2.1 Library”
أو في نسخ دلفي الحديثة من Component ثم Install Component ثم اختر Import Library... الخ.
PHP كود :
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
PHP كود :
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 بهذا الشكل:
إقتباس :لكن متى يجب ضغط (Compact) قاعدة البيانات ؟
أعتقد أن أحسن موعد هو قبل غلق البرنامج، وهذا خيار في MS Access. أو سؤال المستخدم إذا كان أهلا لذلك. في انتظار ما عند الخبراء.
هل افهم من هذا انه يجب عمل ضغط للقآعدة بعد كل استخدآم ؟
وكيف تعد هذه القآعدة قويّة ان كانت تحتاج الى ضغط بعد كل استخدام ؟
في الحقيقة موضوع جميل, وانا في الحقيقة احب هذا القآعدة لسهولتها, لكن ربما علي التّخلّي عنها قريبا,
بارك الله لك وجزآك الله كل خير,:bye1:
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
04-01-2010, 10:17 PM (آخر تعديل لهذه المشاركة: 24-08-2010, 02:11 PM بواسطة kachwahed.)
[COLOR="black"]
إقتباس :هل افهم من هذا انه يجب عمل ضغط للقآعدة بعد كل استخدآم ؟
لا أقول يجب بعد كل استخدام... لكن ينبغي ألا تغفل عليها حتى تشاهد فيلم رعب حقيقي
التنظيف يكون بشكل دوري (شهريا، أسبوعيا، يوميا...) حسب الحاجة وحسب الاستخدام.
إقتباس :وكيف تعد هذه القآعدة قويّة ان كانت تحتاج الى ضغط بعد كل استخدام ؟
نظرية :
إذا افترضنا أن أحسن وسيلة نقل هي الطائرة مثلا ... لأنها أسرع من السيارة...
فهل سنركب الطائرة عوضا عن السيارة للذهاب إلى السوق لأنها أحسن وأسرع وسيلة نقل !!!؟
... كل شيء له استخدامه في نطاق معين...
Microsoft لا زالت تطور MS Access وقد أصدرت نسخة Office 2010
... وفي نفس الوقت لا زالت تطور SQL Server ولم تقل: نتوقف عن تطوير Access مادمنا نطور SQL Server !
وقس على ذلك باقي محركات قواعد البيانات ... لكل عيوب ومميزات ... وما تربحه من جهة قد تخسر لأجله من جهة أخرى
وما عليك إلا الموازنة بحسب ما تحتاج... لأجل أن تخسر أقل شيء مقابل أكبر ربح ممكن.
والله أعلم.
بارك الله لك أخي issamdnn، تشجيعك يدفعني للمزيد.[/COLOR]
إقتباس :لا أقول يجب بعد كل استخدام... لكن ينبغي ألا تغفل عليها حتى تشاهد فيلم رعب حقيقي
التنظيف يكون بشكل دوري (شهريا، أسبوعيا، يوميا...) حسب الحاجة وحسب الاستخدام.
DJILANI كتب :كيف أتأكد من أن هذا الكو د يعمل فعليا
السلام عليكم
حل بسيط برايي
خد قاعدة بيانات ms access لاحد برامجك و قس حجمها اولا ثم قم بعملية تنظيف واصلاح كما هو مبين في الدرس ثم اعد قياس حجمها وقارن الفرق
ولا تنسى هده الرسالة تخبرك بنجاح العملية من فشلها
كود :
ADOConnection1.Close;
if CompactAndRepair(DatabaseName, DatabasePassword) then
ShowMessage('database compact successfully');
ADOTable1.Open;
بالتوفيق
و من طلب العلوم بغير كد _________ سيدركها إذا شاب الغراب