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

كود :
Table1.Close; Table1.EmptyTable; Table1.Open
هذا الكود لا ينفع مع AdoTable
الرد
#2
[INDENT]
يمكنك استعمال ال sql :

كود :
Delete From MyTable
[/INDENT]
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#3
delete * from yourTable
الرد
#4
[INDENT]
الكاسر الآخر كتب :delete * from yourTable

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

وانظر

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

[/INDENT]
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#5
يا إخوان أنا لا أقصد الحذف في حد ذاته (عن طريق الإستعلام البنيوي SQL أو غيره)
كود :
Table1.Delete;
و لكني أقصد مسح كافة البيانات حيث يتم إرجاع ملف القاعدة إلى حجمه الأول (الاصلي عندما كان فارغا)
بصيغة أخرى عندما يتم ملأ الجدول إلى حد معين فإن حجمه يزيد ، و عندما يتم مسح كافة السجلات يبقى نفس الحجم رغم خلوه من السجلات
في البارادوكس مثلا
كود :
While Not Table1.IsEmpty do Table1.Delete;
هذا الأمر يؤدي إلى مسح كافة السجلات لكن يبقى حجم ملف MB ، و كأن الجدول ليس فارغا ، بينما:
كود :
Table1.Close; Table1.EmptyTable; Table1.Open
يتم مسح كل السجلات و إرجاع الملف إلى حجمه الأصلي
السؤال الآن: هذا الأمر لا ينفع مع AdoTable فما هو الحل إذن ؟؟؟
الرد
#6
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;
الرد
#7
[INDENT]
أخي الكاسر الآخر شكرا على المعلومة ، رغم أن في Interbase 7.5 لا يقبل *.

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

backup restore
باستعمال GBack

كود :
http://www.destructor.de/firebird/gbak.htm
[/INDENT]
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#8
نعم يمكن ان تستخدم * أو بدونها ليس هناك مشكلة

أما عن اـ FireBird أنا لا أستخدمها ولكن حسبما قرأت فإنه ليس هناك طريقة لمسح السجلات المحذوفة ألا بعملية النسخ ااحتياطي والاسترجاع لأن Fb تستخدم المساحة التي تشغلعا الملفات المحذوفة عند الحاجة إليها فقط وهذا يمكن أن يكون عيبا في Fb
الرد
#9
أخي Unprogramme كلامك صحيح والسبب يقع في إختلاف قواعد البيانات المستخدمة فأنا أستخدم MsAccess و Sql server ..
الرد
#10
[INDENT]
وايضا الموضوع التالي سيفيدك بإذن الله تعالى .

أداة مجانية لإصلاح قواعد بيانات نوع FireBird/Interbase
[/INDENT]
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم