【问题标题】:Delphi 2006 TClientDataSet index issueDelphi 2006 TClientDataSet 索引问题
【发布时间】:2011-09-20 09:12:22
【问题描述】:

我使用ClientDataSet 和链接到本地​​数据集的DataSetProvider。 当我想编辑 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

【问题讨论】:

  • 向我们提供有关您的问题的更多详细信息.. 编辑:不要像评论一样写。编辑您的帖子以编写新代码..

标签: delphi indexing tclientdataset


【解决方案1】:

在第一轮之后,您在ClientDataSet 上设置了IndexName。当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';
    [..]

【讨论】:

    【解决方案2】:

    当您关闭客户端数据集时,客户端数据集索引始终会被丢弃。客户端数据集上下文中的“持久索引”意味着只要客户端数据集打开,它就会保留在内存中:

    Understanding ClientDataSet Indexes

    TClientDataset indexes: temporary or persistent?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多