我有一个带有名为“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()]'
这看起来很奇怪,因为我没有在我的代码中使用任何书签。
知道发生了什么吗?
经过多次死胡同(包括尝试EmptyTable()方法,导致其他问题),我查看示例代码,发现我没有将外部数据集设置为Edit状态。
确保外部数据集处于编辑状态解决了这个问题,并解决了我在尝试向嵌套数据集添加记录时遇到的类似问题,在嵌套数据集上使用 Append() 和 Post()。在这种情况下,外部数据集(上面代码中的 aDataSet)也必须处于编辑状态。
因为我搜索的时候并没有找到这个错误信息,而且由于数据集不处于编辑状态会引发关于书签的错误是不直观的,所以我决定发布这个。