为什么从 TFDMemTable NestedDataSet 中删除记录时会出现错误“找不到书签”?

问题描述 投票:0回答:1

我有一个带有名为“keywords”的 NestedDataSet 字段的 TFDMemTable,它在名为“keyword”的嵌套数据集中有一个字段。

为了使用这些字段创建 TFDMemTable,我不使用任何持久字段,而是使用 FieldDefs,具有类型为 ftDataSet 的适当字段和一个包含名为“关键字”的单个 ftString 的 ChildDefs。

当我确实使用持久字段时,即使 FieldDefs 也存在,FieldDefs 也没有受到尊重。另一种解决方案是使用持久字段,并使用单个“关键字”字段创建第二个 TFDMemTable,并将子 TFDMemTable 的 DataSetField 属性指向外部数据集中的“关键字”ftDataSet 字段。

当我想删除 NestedDataSet 中的现有记录时,问题就来了。我使用一个简单的循环:

    TDataSetField* keywordsField = dynamic_cast<TDataSetField*>(aDataSet->FieldByName("keywords"));
    if (keywordsField)
    {
        TDataSet* keywordsDataSet = keywordsField->NestedDataSet;
        TField*   keywordField    = keywordsDataSet->FieldByName("keyword");
        keywordsDataSet->First();
        while (!keywordsDataSet->Eof)
        {
            keywordsDataSet->Delete();
        }
    }

但是,当 ->Delete() 执行时,我收到一条错误消息:

Exception class EFDException with message '[FireDAC][Comp][DS]-200.  Bookmark is not found for dataset [TFDCustomMemTable()]'

这看起来很奇怪,因为我没有在我的代码中使用任何书签。

知道发生了什么吗?

delphi c++builder firedac
1个回答
0
投票

经过多次死胡同(包括尝试EmptyTable()方法,导致其他问题),我查看示例代码,发现我没有将外部数据集设置为Edit状态。

确保外部数据集处于编辑状态解决了这个问题,并解决了我在尝试向嵌套数据集添加记录时遇到的类似问题,在嵌套数据集上使用 Append() 和 Post()。在这种情况下,外部数据集(上面代码中的 aDataSet)也必须处于编辑状态。

因为我搜索的时候并没有找到这个错误信息,而且由于数据集不处于编辑状态会引发关于书签的错误是不直观的,所以我决定发布这个。

© www.soinside.com 2019 - 2024. All rights reserved.