3

我使用德尔福 10.3。我尝试创建一个内存数据库,将数据附加到其中并在其中查找数据。

我编写了以下代码引用了其他代码,并且效果很好。

procedure TForm1.DataAppendFind;
var
  _FieldDef: TFieldDef;
  _FDDatsRow: TFDDatSRow;
  i: Integer;
begin
  _FieldDef := FDMemTable1.FieldDefs.AddFieldDef;

  _FieldDef.Name := 'field1';
  _FieldDef.DataType := ftInteger;

  _FieldDef := FDMemTable1.FieldDefs.AddFieldDef;

  _FieldDef.Name :='field2';
  _FieldDef.DataType := ftString;
  _FieldDef.Size := 10;

  FDMemTable1.CreateDataSet;

  FDMemTable1.Append;

  FDMemTable1.FieldValues['field1'] := 1;
  FDMemTable1.FieldValues['field2'] := 'one';

  FDMemTable1.Append;

  FDMemTable1.FieldValues['field1'] := 2;
  FDMemTable1.FieldValues['field2'] := 'two';

  FDMemTable1.First;

  for i := 0 to FDMemTable1.RecordCount - 1 do
  begin
    _FDDatsRow := FDMemTable1.GetRow;

    if _FDDatsRow.Values['field1'] = 2 then
    begin
      Caption := _FDDatsRow.ValueS['field2'];
    end;

    FDMemTable1.Next;
  end;
end;

我无法理解我试图通过 Delphi 参考和谷歌搜索它的 TFDDatSRow。但没有关于这方面的明确文件。我可以猜测它与一行相似,但不是一行,因为它有一个长而复杂的名称,而不仅仅是一个 tROW。

什么是 TFDDatSRow,为什么没有关于它的参考,我在哪里可以获得有关它的正确信息?最后,上面的代码是否正确?

4

1 回答 1

3

是的,您的代码可以正常工作。我承认在你的 q 之前我没有遇到过 TFDDatSRow,但是看过它之后,很明显它的用途是什么。

FireDAC 的数据集组件都源自 TDataSet,因此符合其建模数据集操作的方式,也就是说,当数据集打开时,它有一个逻辑光标,它恰好“超过”数据集中的一条记录,它就是记录,德尔福术语中的“活动”记录,在其上发生Edit, Post,FieldByName等操作。这可以正常工作,但会使某些操作变得不可能,例如同时处理两条记录,例如,当您想在两条不同的记录之间交换值时,因为它们不能同时是数据集的活动记录。

我说 TFDDatSRow 的用途很明显,一件事是允许对 2 个或更多记录进行精确的并发访问。

例如,这段代码

  FDMemTable1.First;
  FDDatsRow1 := FDMemTable1.GetRow;
  FDMemTable1.Next;
  FDDatsRow2 := FDMemTable1.GetRow;

  FDDatSRow1.BeginEdit;
  FDDatSRow1.Values['Field2'] := FDDatSRow2.Values['Field2'];
  FDDatSRow1.EndEdit(False);

使数据能够以没有 TFDDatSRow 无法实现的方式从第二行传输到第一行。

为什么没有记录在案?不知道,问EMBA。

我是怎么知道它的方法的?很简单,我声明了一个变量

 var FDDatSRow1 : TFDDatSRow;

然后输入

  FDDatSRow1.

并且 IDE 的代码完成弹出了它们。

此外,选择TFDDatSRow并执行 Ctrl-Click 会将我带到 FireDac.DatS 单元中的声明。看看那里,FireDAC 的作者显然比我的示例中显示的要多得多。

于 2019-05-11T16:49:50.170 回答