我使用ClientDataSet
与DataSetProvider
链接到本地DataSet。
当我想编辑DataSet中的数据时,我打开ClientDataSet并向其添加一些索引。编辑完数据后,关闭ClientDataSet。
一切正常,只有当我再次打开ClientDataSet并选择索引时,它会抛出一条带有消息"index 'xxx' not found".
的异常
我做错了什么?
以下是打开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是ClientDataset
答案 0 :(得分:2)
在第一轮结束后,您IndexName
上设置了ClientDataSet
。当IndexDefs
被丢弃时,它引用的索引变为无效。在重新打开数据集之前清除IndexName
,即将代码修改为:
[..]
try
with DM.tblCCardDep do
begin
IndexDefs.Clear;
IndexName := ''; // <- here
if not Active then Open;
[..]
或使用以下内容: [..]
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';
[..]
答案 1 :(得分:0)
关闭客户端数据集时,始终会丢弃客户端数据集索引。客户端数据集上下文中的“持久索引”意味着只要客户端数据集处于打开状态,它就会保留在内存中: