Wieviele Änderungen gibt es in der Datenbank?
Wie groß ist die Datenbankdatei?
Eventuell hilft es, die Datenbank ab und an mal von
Access reparieren zu lassen, sie wird dann auf eine erträgliche Dateigröße "geschrumpft". Vermutlich werden auch die Indizes neu erstellt.
Mir scheint (subjektiv) der Zugriff anschließend flüssiger vorzukommen.
Schau doch mal bitte nach, ob Du bei Dir die Komponente TJetEngine installiert hast. Sie ist in der JRO-Typlib zu finden.
Code:
// Typbib: C:\Programme\Gemeinsame Dateien\System\
ado\msjro.dll (1)
// LIBID: {AC3B8B4C-B6CA-11D1-9F31-00C04FC29D52}
// LCID: 0
// Hilfedatei: C:\Programme\Gemeinsame Dateien\System\
ado\msjro.chm
// Hilfe-String: Microsoft Jet and Replication Objects 2.6 Library
// DepndLst:
// (1) v2.0 stdole, (C:\WINDOWS\system32\STDOLE2.TLB)
// (2) v2.8 ADODB, (C:\Programme\Gemeinsame Dateien\System\
ado\msado15.dll)
Mit 'nem Quelltext in der Art, könntest Du das Packen auch von Deinem Programm übernehmen lassen:
Delphi-Quellcode:
procedure TfmAccessDatenbankenPacken.PackMDB(sDatenbankname :
String);
var
sConnectionString : WideString;
sdbTemp : WideString;
sdb : WideString;
sConDB : WideString;
sConDBTemp : WideString;
begin
Screen.Cursor := crSQLWait;
sConnectionString := '
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;'
+ '
Mode=ReadWrite;Extended Properties="";'
+ '
Jet OLEDB:System database="";'
+ '
Jet OLEDB:Registry Path="";'
+ '
Jet OLEDB:Database Password="";'
+ '
Jet OLEDB:Engine Type=5;'
+ '
Jet OLEDB:Database Locking Mode=1;'
+ '
Jet OLEDB:Global Partial Bulk Ops=2;'
+ '
Jet OLEDB:Global Bulk Transactions=1;'
+ '
Jet OLEDB:New Database Password="";'
+ '
Jet OLEDB:Create System Database=False;'
+ '
Jet OLEDB:Encrypt Database=False;'
+ '
Jet OLEDB:Don''
t Copy Locale on Compact=False;'
+ '
Jet OLEDB:Compact Without Replica Repair=False;'
+ '
Jet OLEDB:SFP=False';
sDB := sDatenbankname;
sDBTemp := ChangeFileExt(sDB,'
.tmp.mdb');
sConDB := Format(sConnectionString,[sDB]);
sConDBTemp := Format(sConnectionString,[sDBTemp]);
Application.ProcessMessages;
if FileExists(sdbTemp)
then DeleteFile(sdbTemp);
try
je.CompactDatabase(sConDB,sConDBTemp);
DeleteFile(sdb);
RenameFile(sdbTemp, sDB);
except
on E :
Exception do begin
MessageDlg(E.
Message,mtError,[mbOK],0);
end;
end;
Screen.Cursor := crDefault;
Application.ProcessMessages;
end;
Das ist aus 'nem Programm geklaut und muss nicht sofort so funktionieren, aber vielleicht kannst Du damit ja was anfangen.