Code: Alles auswählen
Dataset := TBufDataset.Create(nil);
try
Dataset.FileName := DB_FILE_NAME;
if not FileExists(DB_FILE_NAME) then
begin
Dataset.FieldDefs.Clear;
Dataset.FieldDefs.Add('LastName', ftString, 20);
Dataset.FieldDefs.Add('FirstName', ftString, 20);
Dataset.FieldDefs.Add('ID', ftString, 4);
Dataset.CreateDataset;
Dataset.Open;
Dataset.AppendRecord(['Einstein', 'Albert', '0003']);
Dataset.AppendRecord(['Lennon', 'John', '0002']);
Dataset.AppendRecord(['Monroe', 'Marylin', '0001']);
Dataset.AppendRecord(['Steinbeck', 'John', '0004']);
Dataset.AppendRecord(['Joplin', 'Janis', '0005']);
// <--- hier: Dataset.Close einfügen, um den Crash zu verhindern
end;
Dataset.Open;
ListRecords('Records directly from file');
Dataset.IndexFieldNames := 'ID';
ListRecords('Records after setting IndexFieldNames="ID"...');
Dataset.Refresh;
ListRecords('... and calling Refresh');
finally
Dataset.Close;
Dataset.Free;
end;
Damit bei in-memory-BufDatasets Refresh nicht aufgerufen wird und dabei Daten verloren gehen, würde ich das bereits veränderte TBufDataset.internalRefresh um eine weitere Anweisung ergänzen:
Code: Alles auswählen
procedure TBufDataset.InternalRefresh;
const
SErrNoInMemoryRefresh = 'In-memory table cannot be refreshed.';
begin
if (FileName = '') then
DatabaseError(SErrNoInMemoryRefresh, Self);
if (ChangeCount>0) then
CancelUpdates;
inherited;
end;