您如何访问 memtable 以拉取记录以在 delphi 中进行编辑?

How do you access a memtable to pull to a record for edit in delphi?

我知道如何根据唯一 ID 从 ADO 查询中提取信息。有没有办法用 memtable 做到这一点,但没有唯一的 ID 来建立记录以进行编辑。可以只使用 memtable 中当前选中的项吗?

编辑:

它是一个 Tkbmmemtable,它是第三方组件,但我认为它的工作方式类似于 Delphi 中嵌入的任何内容。长话短说,会出现一个从用户那里接收数据的表单。每次点击 ok 时,它都会将其添加到 tkbmmemtable(在网格中向用户显示)并存储在那里,直到用户点击 "write to database",然后将其写入具有唯一 ID 的后端。我正在尝试启用双击网格中记录的功能,然后出现一个屏幕,他们可以在其中编辑数据,然后 post 将其返回到内存表。

Can you use just the currently selected item in the memtable?

简短的回答是 "Yes",正如@KenWhite 所精辟地解释的那样。

答案是 "Yes" 的原因是因为 TDataSet 及其后代如 TKbmMemtable 的工作方式。

你可能知道吗,TDataSet 等人的定义行为是它模拟了一个内部 "cursor",它指向数据集中的一个记录,并且该记录由 TDataSet 和所有 db-感知控件作为 "active" 记录:您可以通过 FirstLastNextLocate 等方法移动逻辑光标来导航数据集

在内部,当 TDataSet 打开时,它有一个 "buffers" 数组,这些数组是指向动态分配的内存块的指针,每个内存块存储数据集中连续记录范围之一的数据。打开数据集时缓冲区的数量是固定的,并且由连接到数据集的 db-aware 组件决定;通常它们的数量足以容纳 TDbGrid 中的行。

TDataSet 有一个方法(函数)ActiveBuffer,它在 DB.Pas 中定义为

function TDataSet.ActiveBuffer: PChar;
begin
  Result := FBuffers[FActiveRecord];
end;

对数据集数据的任何编辑操作都会对ActiveBuffer中的记录数据进行操作,它由TDataSet.ActiveBuffer returns中的指针简单标识。这就是所有需要的,这就是为什么在没有任何 ID/PK/SequenceNumber 或任何字段的情况下对内存数据集中的记录进行编辑操作也能正常工作的原因。

就是这样,真的。

逻辑是: 1.使用adoquery拉取数据 2.将数据放入memtable 3.用户将编辑值 4.保存修改
将您的 memtable 视为容器。所以当保存到数据库时,您的代码将更像这样:

var
script : string;
begin
  if insert then
  begin
   script :=
     'insert into table(c1, c2, c3) values (' +
      QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      QuotedStr(memTable.FieldByName('c1').AsString) + ' ' +
      ')';
  end
  else
  begin
    script :=
      'update table set ' +
      'c1='+ QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      'c1='+ QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      'c1='+ QuotedStr(memTable.FieldByName('c1').AsString) + ',' +
      'where id = ' + IntToStr(memTable.FieldByName('id').AsInteger);
  end;
 // adoQuery.Execute(script);

end;