Ich benutze ein ClientDataSet
mit einem DataSetProvider
verknüpft mit einem lokalen DataSet. Wenn ich die Daten im DataSet bearbeiten möchte, öffne ich das ClientDataSet und füge einige Indizes hinzu. Nachdem ich die Daten bearbeitet habe, schließe ich das ClientDataSet. Alles funktioniert gut, außer dass, wenn ich ClientDataSet erneut öffne und einen Index auswähle, eine Ausnahme mit der Nachricht ausgelöst wird "index "xxx" not found".
Was mache ich falsch?
Hier ist der Code zum Öffnen von ClientDataSet:
Application.CreateForm (TfrmCardDep, frmCardDep);
try
with DM.tblCCardDep do
begin
IndexDefs.Clear;
if not Active then Open;
AddIndex ("iDepID", "DepID", []);
AddIndex ("iDep", "Dep", []);
IndexName := "iDep";
FieldByName("Dep").DisplayLabel := "Departament";
FieldByName("Dep").DisplayWidth := 50;
FieldByName("DepID").Visible := false;
end;
frmCardDep.ShowModal;
finally
if DM.tblCCardDep.Active then DM.tblCCardDep.Close;
frmCardDep.Free; frmCardDep := nil;
end;
DM.tblCCardDep ist das ClientDataset
Antworten:
2 für die Antwort № 1Nach der ersten Runde hast du IndexName
setzen auf die ClientDataSet
. Wann IndexDefs
verworfen wird, wird der Index ungültig. klar IndexName
Bevor Sie den Datensatz erneut öffnen, ändern Sie den zu lesenden Code:
[..]
try
with DM.tblCCardDep do
begin
IndexDefs.Clear;
IndexName := ""; // <- here
if not Active then Open;
[..]
Oder verwenden Sie so etwas: [..]
try
with DM.tblCCardDep do
begin
if not Active then Open;
if IndexDefs.Count = 0 then
begin
AddIndex ("iDepID", "DepID", []);
AddIndex ("iDep", "Dep", []);
IndexDefs.Update; // Update IndexDefs
IndexName := "iDep";
end;
FieldByName("Dep").DisplayLabel := "Departament";
[..]
0 für die Antwort № 2
Client-Dataset-Indizes werden immer dann gelöscht, wennSie schließen das Client-Dataset. "Persistenter Index" im Kontext des Client-Datasets bedeutet, dass es im Speicher bleibt, solange das Client-Dataset geöffnet ist:
Grundlegendes zu ClientDataSet-Indizes
TClientDataset-Indizes: temporär oder persistent?