Autor Beitrag
xel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Di 27.08.02 21:15 
Hi all,

also nach der Datensicherung wird meine datenbank gelöscht... d.h. der Inhalt wird gelöscht halt die Datensätze!...
aber meine datenbank bleibt immernoch 3 MB gross.. warum?? es ist doch nix mehr drin?

Ich benutze eine Paradox7 Tabelle ohne Query!

Muss ich nach der "leerung" :-P noch was machen???

Dankeschon für alle antworten...
Xel
a.C.k
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Mi 28.08.02 09:24 
Schau mal ob sie kleiner wird, wenn du in der Datnbankoberfläche die Tabelle kompremieren tust.

Ich hatte mal das selbe Problem.
Daten werden in einer Datenbank nicht unbedingt gelöscht, sondern nur nicht mehr angezeigt. Somit können "gelöschte" Daten nach fehlern wieder hergestellt werden. Allerdings wächst natürlich auch die größe der Datenbank ins unermesliche :(.

Also must du dir wohl gedanken machen, wie du diese Kompremieren kannst.
Icch such mal, wie ich es damals geschafft hatte.

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 28.08.02 10:24 
a.C.k hat folgendes geschrieben:
Schau mal ob sie kleiner wird, wenn du in der Datnbankoberfläche die Tabelle kompremieren tust.

Mit sicherheit.

a.C.k hat folgendes geschrieben:
Daten werden in einer Datenbank nicht unbedingt gelöscht, sondern nur nicht mehr angezeigt. Somit können "gelöschte" Daten nach fehlern wieder hergestellt werden. Allerdings wächst natürlich auch die größe der Datenbank ins unermesliche :(.

Das ist nur zum Teil richtig. Gelöschte Datensätze werden in der Tat nur als gelöscht markiert. Dies geschiht aber nicht um sie später wieder herstellen zu können (das ist nur ein angenehmer nebeneffekt) sondern aus performance gründen.
Stell dir die Tabellen-Datei am besten als Eine Reihe von aneinander gehängten Datensätze vor, also als eine Reihe von Blöcken. Nehmen wir an sie enthält 3.000.000 solcher blöcke. Wenn du jetzt den zweiten löscht, müssten 2.999.998 Blöcke nach vorne verschoben werden um wieder eine gültige Datei zu haben. Im Speicher währe das schon nicht wirklich schnell, auf der Festplatte ist es tötlich. Daher Markiet man den zweiten Block einfach als gelöscht und lässt ihn da wo er ist. Wenn jetzt ein neuer Datensatz angelegt wird, überschreibt man den als gelöscht Markierten Block 2 mit diesem neuen, man hat also noch immer eine gültige Datei, und sie wächst durch den neuen Datensatz nicht, solange noch gelöschte vorhanden sind.
Wenn man mehr löscht als man eingibt ist dieses vorgehen allerdings störend. Das Packen der Tabelle macht nichts anderes als das Verschieben der nicht gelöschen Blöcke an den Anfang der Datei und das entfernen der gleöschten (über die genaue Strategie wollen wir nicht steiten). Es stellt also eine Art Defrakmentieren der Tabelle da, dies ist wie erwähnt recht zeitaufwendig, wenn man es nach jeden löschvorgang durchführen wollte.

Wenn du deine Tabelle in der Datenabankoberfläche öffnest, dann musst du auf Tabelle->Umstrukturieren gahen und das Komprimieren Häckchen wählen. Wenn ich die Logik richtig verstehe verseckt sich dahinter die Tabeele-Packen funktionalität.

Gruß
Klabautermann
a.C.k
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Mi 28.08.02 11:21 
@ Klabautermann:

Vielen Dank für die Korektur ;). Verstehe die Problematik nun wesentlich besser.

@ Xel:

Falls du die Datenbank während der Laufzeit in deinem Program kompremieren willst, hilft dir vieleicht dieser Quelltext:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Kompremieren1Click(Sender: TObject); 
var 
  TblDesc : CRTblDesc; 
begin 
  With Table1 do 
  begin 
    Active := false; 
    Databasename := 'Datenbankname'; 
    Tablename := 'tabellenname' 
  end; 
  Database1.Connected := True; 
  FillChar(TblDesc,SizeOf(CRTblDesc),#0); 
  With TblDesc do 
  begin 
    StrPCopy(szTblName, Table.TableName); 
    StrCopy(szTblType,szParadox); 
    bPack := true; 
  end; 
  Check(DbiDoRestructure(Database1.Handle,1, @TblDesc, Nil, Nil, Nil, False)); 
  Database1.Connected := false; 
  With Table1 do 
    begin 
    Databasename := ''; 
    Tablename := 'tabellenname'; 
    Active := true; 
  end; 
end;


Benötigt wird dazu noch eine TDatabase.

Viel erfolg ;)

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
xel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: Mi 28.08.02 19:29 
Titel: das muss doch besser gehen!?
Also ganz einfach ich will eigentlich eine gesamte Tabelle löschen!.. auch die bytes die es verbraucht....

so ist mein ansatz:

ausblenden Quelltext
1:
2:
3:
repeat
          Form1.Table3.Delete;
      until Form1.Table3.IsEmpty;


kann das nicht irgenwie so funtionieren...

ausblenden Quelltext
1:
2:
3:
4:
 repeat
          Form1.Table3.Delete;
          Form1.Table3.Deletebyte; //erfunden quellcode gibt es nicht!
      until Form1.Table3.IsEmpty;


ansonsten "a.C.k" wie geht dein Code nur für eine Tabelle die 'adressen' heist.

Danke für eure gedult...
Xel
a.C.k
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Do 29.08.02 09:22 
@ Xel:
Du must halt überall wo "tabellenname" steht "adressen" eintragen.

Vergess aber nicht das du eine "Database" (Komponente) einbauen musst.

MfG
Andreas-Carl Kreiling

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
PascalKlaus
Hält's aus hier
Beiträge: 2

Win2000
D5,D7 Pro
BeitragVerfasst: Mo 02.09.02 11:50 
Alle Datensätze (physisch) löschen geht mit der Methode EmptyTable.
Dazu muss die Tabelle exklusiv geöffnet sein (nur 1 Nutzer hat Zugriff).
Das geht so, wenn die Tabelle "adressen" heißt:

adressen.active:=false;
adressen.exclusive:=true;
adressen.active:=true;
adressen.emptytable;
{jetzt kann man die Tabelle wieder auf Mehrfachzugriff setzen}
adressen.active:=false;
adressen.exclusive:=false;
{und wieder öffnen}
adressen.active:=true;