delphi4arab منتديات دلفي للعرب

نسخة كاملة : إصلاح وضغط قاعدة البيانات MS Access
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3
بسم الله الرحمن الرحيم

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

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

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

* هنا Access ينكر ملفات قاعدة يباناته ويتبرأ منها Smile:
[صورة: error2239_2.gif]

[صورة: error2239_3.gif]

الحل الأمثل لتفادي فيلم الرعب السابق، هو تنظيف (أو ضغط) قاعدة البيانات باستمرار أو ما يعرف بالقيام بـ 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
برأيي أن التحقق من وجود الملف في هذه مثل الحالات ضروري جدا...
لا تدري ما الذي سيحصل !؟ وعدم إصلاح قاعدة البيانات خير من حذفها بالكامل!
يتبع...
-الطريقة الثانية: باستخدام مكتبة من النظام 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 بهذا الشكل:
كود :
"%programfiles%\Microsoft Office\Office12\msaccess.exe" /compact *.mdb
ويمكن تطبيق هذا السطر من دلفي بـ ShellExecute مثلا.

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

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

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

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

بارك الله لك وجزآك الله كل خير,:bye1:
الله يعطيك ألف عافية
الحقيقة موضوع جميل جداً ويستحق التقدير . وخصوصاً أني دائم الإستخدام لقواعد بيانات ال MS Access .

شكراً مجدداً.
[COLOR="black"]
إقتباس :هل افهم من هذا انه يجب عمل ضغط للقآعدة بعد كل استخدآم ؟
لا أقول يجب بعد كل استخدام... لكن ينبغي ألا تغفل عليها حتى تشاهد فيلم رعب حقيقي Big Grin
التنظيف يكون بشكل دوري (شهريا، أسبوعيا، يوميا...) حسب الحاجة وحسب الاستخدام.

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

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

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

بارك الله لك اخي الكريم,
إقتباس :فيلم الرعب الذي تتحدث عنه,,
في بعض الأحيان حتى 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
إقتباس :اذا نحتآج موضوع يوضح لنا متى نستخدم اي قآعدة
هذا أتركه للخبراء Smile.
كيف أتأكد من أن هذا الكو د يعمل فعليا
DJILANI كتب :كيف أتأكد من أن هذا الكو د يعمل فعليا
السلام عليكم
حل بسيط برايي
خد قاعدة بيانات ms access لاحد برامجك و قس حجمها اولا ثم قم بعملية تنظيف واصلاح كما هو مبين في الدرس ثم اعد قياس حجمها وقارن الفرق
ولا تنسى هده الرسالة تخبرك بنجاح العملية من فشلها
كود :
ADOConnection1.Close; if CompactAndRepair(DatabaseName, DatabasePassword) then ShowMessage('database compact successfully'); ADOTable1.Open;
بالتوفيق
كود :
procedure TForm5.Button3Click(Sender: TObject); begin DataModule1.ADOConnection1.Close; if CompactAndRepair('E:\Projet\gestion commerciale\gestion commerciale\gestion commerciale\gestion commerciale.mdb','') then ShowMessage('database compact successfully'); DataModule1.utilisateur.Open; end;

كود :
[align=left]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 + 'E:\Projet\gestion commerciale\gestion commerciale\gestion commerciale\gestion commerciale.mdb', Password])); if FileExists(DB + 'E:\Projet\gestion commerciale\gestion commerciale\gestion commerciale\gestion commerciale.mdb') then begin DeleteFile(DB); RenameFile(DB + 'E:\Projet\gestion commerciale\gestion commerciale\gestion commerciale\gestion commerciale.mdb', DB) end; finally v := Unassigned end; { try } except Result := False end; { try } end; { CompactAndRepair }[/align]

إستعملت الكود التالي ولم يعمل معي؟
الصفحات : 1 2 3