delphi4arab منتديات دلفي للعرب
مسح / تفريغ بيانات جدول Firebird - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : مسح / تفريغ بيانات جدول Firebird (/showthread.php?tid=6839)

الصفحات: 1 2 3


مسح / تفريغ بيانات جدول Firebird - nabilkeb - 03-03-2015

كيف يتم تفريغ كلي لجدول قواعد البيانات Firebird ؟؟؟
الإتصال عن طريق (AdoConnection)
في الحالة العادية (بارادوكس) و مكون Table أو Absolute و مكون ABSTable

كود :
Table1.Close; Table1.EmptyTable; Table1.Open
هذا الكود لا ينفع مع AdoTable


مسح / تفريغ بيانات جدول Firebird - أبو معاذ - 03-03-2015

[INDENT]
يمكنك استعمال ال sql :

كود :
Delete From MyTable
[/INDENT]


مسح / تفريغ بيانات جدول Firebird - الكاسر الآخر - 03-03-2015

delete * from yourTable


مسح / تفريغ بيانات جدول Firebird - أبو معاذ - 03-03-2015

[INDENT]
الكاسر الآخر كتب :delete * from yourTable

هل أنت متأكد من الصيغة ؟
على ما أعتقد أنه لا يوجد *

وانظر

كود :
http://sql.sh/cours/delete

[/INDENT]


مسح / تفريغ بيانات جدول Firebird - nabilkeb - 03-03-2015

يا إخوان أنا لا أقصد الحذف في حد ذاته (عن طريق الإستعلام البنيوي SQL أو غيره)
كود :
Table1.Delete;
و لكني أقصد مسح كافة البيانات حيث يتم إرجاع ملف القاعدة إلى حجمه الأول (الاصلي عندما كان فارغا)
بصيغة أخرى عندما يتم ملأ الجدول إلى حد معين فإن حجمه يزيد ، و عندما يتم مسح كافة السجلات يبقى نفس الحجم رغم خلوه من السجلات
في البارادوكس مثلا
كود :
While Not Table1.IsEmpty do Table1.Delete;
هذا الأمر يؤدي إلى مسح كافة السجلات لكن يبقى حجم ملف MB ، و كأن الجدول ليس فارغا ، بينما:
كود :
Table1.Close; Table1.EmptyTable; Table1.Open
يتم مسح كل السجلات و إرجاع الملف إلى حجمه الأصلي
السؤال الآن: هذا الأمر لا ينفع مع AdoTable فما هو الحل إذن ؟؟؟


مسح / تفريغ بيانات جدول Firebird - الكاسر الآخر - 03-03-2015

Unprogramme كتب :هل أنت متأكد من الصيغة ؟ على ما أعتقد أنه لا يوجد *
نعم يمكن ان تستخدم * أو بدونها ليس هناك مشكلة

بانسبة لـ ADO .. اذا كنت تستخدم Ms Access فعليك عمل compact لقاعدة البيانات ..
لقد وجدت لك هذا الكود ولكنني لم أجربه

كود :
var dao: OLEVariant; begin dao := CreateOleObject('DAO.DBEngine.35'); dao.CompactDatabase('d:\yourDatabaseName.mdb', 'd:\yourNewCompactedDatabaseName.mdb'); end;

وأيضا هذا الكود (الذي يشترط أن تكون خاصية connected في Adoconnection <> true في وقت التصميم)

كود :
uses ComObj; procedure JroRefreshCache(ADOConnection: TADOConnection); var JetEngine: OleVariant; begin if not ADOConnection.Connected then Exit; JetEngine := CreateOleObject('jro.JetEngine'); JetEngine.RefreshCache(ADOConnection.ConnectionObject); end; procedure JroCompactDatabase(const Source, Destination: string); var JetEngine: OleVariant; begin JetEngine := CreateOleObject('jro.JetEngine'); JetEngine.CompactDatabase( 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + Source, 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + Destination + ';Jet OLEDB:Engine Type=5'); end; procedure CompactDatabase(const MdbFileName: string; ADOConnection: TADOConnection=nil; const ReopenConnection: Boolean=True); var LdbFileName, TempFileName: string; FailCount: Integer; FileHandle: Integer; begin TempFileName := ChangeFileExt(MdbFileName, '.temp.mdb'); if Assigned(ADOConnection) then begin // force the database engine to write data to disk, releasing locks on memory JroRefreshCache(ADOConnection); // close the connection - this will also close all associated datasets ADOConnection.Close; end; // ADOConnection.Close SHOULD delete the ldb // force delete of ldb lock file just in case if we don't have an active ADOConnection LdbFileName := ChangeFileExt(MdbFileName, '.ldb'); if FileExists(LdbFileName) then DeleteFile(LdbFileName); // could fail because data is still locked - we ignore this // delete temp file if any if FileExists(TempFileName) then if not DeleteFile(TempFileName) then RaiseLastOSError; // try to open for exclusive use FailCount := 0; repeat FileHandle := FileOpen(MdbFileName, fmShareExclusive); try if FileHandle = -1 then // error begin Inc(FailCount); Sleep(100); // give the database engine time to close completely and unlock end else begin FailCount := 0; Break; // success end; finally FileClose(FileHandle); end; until FailCount = 10; // maximum 1 second of attempts if FailCount <> 0 then // file is probably locked by another user/process raise Exception.Create(Format('Error opening %s for exclusive use.', [MdbFileName])); // compact the db JroCompactDatabase(MdbFileName, TempFileName); // copy temp file to original mdb and delete temp file on success if Windows.CopyFile(PChar(TempFileName), PChar(MdbFileName), False) then DeleteFile(TempFileName) else RaiseLastOSError; // reopen ADOConnection if Assigned(ADOConnection) and ReopenConnection then ADOConnection.Open; end; procedure TForm1.Button1Click(Sender: TObject); begin CompactDatabase('F:\Projects\DB\mydb.mdb', ADOConnection1, True); // reopen DataSets ADODataSet1.Open; end;



مسح / تفريغ بيانات جدول Firebird - أبو معاذ - 03-03-2015

[INDENT]
أخي الكاسر الآخر شكرا على المعلومة ، رغم أن في Interbase 7.5 لا يقبل *.

بالنسبةلأخي نبيل ،
إذن أنت تبحث عن الحذف الفزيائي (الحقيقي ) للسجلات.
بالنسبة لقواعد البيانات Firebird ، يمكن عمل تخزين sauvegarde ثم استرجاع restauration

backup restore
باستعمال GBack

كود :
http://www.destructor.de/firebird/gbak.htm
[/INDENT]


مسح / تفريغ بيانات جدول Firebird - الكاسر الآخر - 03-03-2015

نعم يمكن ان تستخدم * أو بدونها ليس هناك مشكلة

أما عن اـ FireBird أنا لا أستخدمها ولكن حسبما قرأت فإنه ليس هناك طريقة لمسح السجلات المحذوفة ألا بعملية النسخ ااحتياطي والاسترجاع لأن Fb تستخدم المساحة التي تشغلعا الملفات المحذوفة عند الحاجة إليها فقط وهذا يمكن أن يكون عيبا في Fb


مسح / تفريغ بيانات جدول Firebird - الكاسر الآخر - 03-03-2015

أخي Unprogramme كلامك صحيح والسبب يقع في إختلاف قواعد البيانات المستخدمة فأنا أستخدم MsAccess و Sql server ..


مسح / تفريغ بيانات جدول Firebird - أبو معاذ - 03-03-2015

[INDENT]
وايضا الموضوع التالي سيفيدك بإذن الله تعالى .

أداة مجانية لإصلاح قواعد بيانات نوع FireBird/Interbase
[/INDENT]