Entwickler-Ecke

Datenbanken - TClientDataSet verliert Daten


ralph - Do 16.02.06 15:09
Titel: TClientDataSet verliert Daten
Hallo,

irgendetwas ist stimmt mit meiner TClientDataset Kompo nicht, oder ich habe etwas nicht verstanden !?.

Ich benutze eine TClientDataSet Kompo (mit Namen Tarife) für eine lokale Datenbank auf der Festplatte.

Erst öffne ich die Datenbank im Ereignis OnShow des Formulars und weise der Kompo die Datenbankdatei Tarife.cds zu.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm4.FormShow(Sender: TObject);
begin

Tarife.FileName := Form1.Pfad + ('Tarife.cds');

Tarife.Open;

end;


Die Datenbank ist noch leer und verfügt über keine Datensätze.

Nun soll ein Datensatz hinzugefügt werden. Dies geschieht im OnClick Ereignis einen normalen ToolButtons.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm4.ToolButton1Click(Sender: TObject);
begin

Tarife.Append;

DBEdit1.SetFocus;

Tarife.Post;

end;


Im Formular befindet sich ein DBGrid und die entsprechenden DBEdit Felder. Die Schreibmarke steht also im Feld DBEdit1. Ich fülle insgesamt 4 Felder aus. Wenn ich fertig bin, dann click ich einen Button OK an der folgenden Code ausführt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm4.Button1Click(Sender: TObject);

begin

Form4.Close;

end;


Es wird also das Formular geschlossen. Im OnClose Ereignis des Formulars wird dann folgender Code ausgeführt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin

Form4.Tarife.Close;

end;


Es wird die Datenbank geschlossen. Wenn ich das Programm starte und das Formular aufrufe, um Daten einzugeben, klappt es. Beende ich das Programm und starte es erneut, sind alle Daten futsch. Was mache ich falsch, oder ist es ein Bug in der Kompo TClientDataSet ? Oder muß nach jeder Datensatzänderung oder wenn ein Satz hinzugefügt wurde, zuerst die Methode TClientDataSet.SavetoFile aufgerufen werden und erst dann werden die Änderungen auf die Platte geschrieben, bevor die Methode TClientDataSet.Close zum Zuge kommt ? Wer kann mir ein einfaches nachvollziehbares Beispiel geben, sonst komm ich nicht weiter. Ich will keine BDE Datenbank einsetzen und kein Mysql und Mitstreiter. Für mein kleines Programm, was lediglich in einer Erfassungsmaske ein paar Daten entgegennimmt und dann ausdruckt lohnt es sich nicht, einen Datenbankserver einzusetzen.

Ralli


digi_c - Do 16.02.06 15:42

Ich verbürge mich nicht dafür aber ich glaube du musst wie du schon sagtest SaveToFileaufrufen da das nur eine Tabelle im RAM ist. Man möge mich aber bitte ggF. korrigieren ;-)


noidic - Do 16.02.06 15:45

Das Post steht an der falschen Stelle. Aktuell fügst du eine ( leere ) Zeile per Append hinzu und postest dann direkt. Die Änderungen, die du im DBEdit vornimmst, werden zwar ins Dataset eingetragen, aber nie gepostet.


ralph - Do 16.02.06 16:58
Titel: Post bekommt einen extra Button
Ja, ich habe es schon selbst bemerkt, das Post habe ich auf einen extra Button (Daten übernehmen) verlegt. Es gibt nicht nur Dau's sondern ich bin ein dap. Bin leicht überarbeitet. Ein selten dummer Fehler.

Trotzdem Danke

Ralli