Database 在TDataset Delphi中交换两条记录的最佳方法?

Database 在TDataset Delphi中交换两条记录的最佳方法?,database,delphi,swap,tdataset,Database,Delphi,Swap,Tdataset,一般来说,我对delphi和数据库编程不熟悉,但我很好奇是否有更好的方法来交换TDataset中的记录?我读了一些帮助,找不到任何明显的方法。目前,我实现了一个过程,将记录向下移动到数据集,直到它们到达Eof标记。然而,当我到达数据中的最后一条记录时,我得到了一些奇怪的错误。我所做的只是实现了一个标准的数组样式交换例程,试图在处理活动记录的同时保留数据等等 迄今为止的代码 程序TForm2.btnDownClick(发送方:TObject); 变量 sTmp,sTmp2:字符串; iTmp,iT

一般来说,我对delphi和数据库编程不熟悉,但我很好奇是否有更好的方法来交换TDataset中的记录?我读了一些帮助,找不到任何明显的方法。目前,我实现了一个过程,将记录向下移动到数据集,直到它们到达Eof标记。然而,当我到达数据中的最后一条记录时,我得到了一些奇怪的错误。我所做的只是实现了一个标准的数组样式交换例程,试图在处理活动记录的同时保留数据等等

迄今为止的代码
程序TForm2.btnDownClick(发送方:TObject);
变量
sTmp,sTmp2:字符串;
iTmp,iTmp2:整数;
开始
TBL匹配。禁用控制;
如果(tblMatched.Eof true),则
开始
//抓取要交换的数据
tblMatched.GotoBookmark(tblMatched.GetBookmark);
iTmp:=tblMatched.Fields[0]。AsInteger;
sTmp:=tblMatched.Fields[1]。关联字符串;
TBL匹配。下一步;
iTmp2:=tblMatched.Fields[0]。AsInteger;
sTmp2:=tblMatched.Fields[1]。关联字符串;
//交换数据
TBL匹配。之前;
tblMatched.Edit;
tblMatched.Fields[0]。值:=iTmp2;
tblMatched.Fields[1]。值:=sTmp2;
TBL匹配。下一步;
tblMatched.Edit;
tblMatched.Fields[0]。AsInteger:=iTmp;
tblMatched.Fields[1]。关联字符串:=sTmp;
结束;
TBL匹配。启用控制;
结束;

看起来您正在使用内存中的数据集,例如TClientDataset。如果您只是在数据集上放置一个索引,它将为您保持事物的有序性,这样您就不必手动重新排列它们。只要根据您希望使用的任何标准设置索引。

是的,我使用的是内存数据集。我需要保留记录的自然顺序,因为这将取决于用户操作记录顺序(即,向下或向上移动记录)。不确定这是否适用于所有数据集,但我知道在TClientDataset上可以定义多个索引。让其中一个保持自然顺序,并向维护用户定义顺序的数据集添加“顺序”字段。在该字段上放置一个索引,并在向用户显示数据时将其设为活动索引。然后,当您需要按自然顺序处理数据时,切换到自然顺序索引。因此,如果我有order字段并希望向上递减(即,向上移动数据集),那么我所需要做的就是递减活动记录上的order字段?那它所取代的唱片呢?我可以在发布递减记录之前获取此记录吗?不,一次只能有一条活动记录。您需要更改这两条记录的顺序值。首先尝试调用数据集上的DisableControls,以避免在交换内容时产生副作用。
procedure TForm2.btnDownClick(Sender: TObject);
var
   sTmp,sTmp2  : string;
   iTmp,iTmp2  : integer;
begin
   tblMatched.DisableControls;
   if ( tblMatched.Eof <> true ) then
   begin
      // Grab data to swap
      tblMatched.GotoBookmark( tblMatched.GetBookmark );
      iTmp := tblMatched.Fields[0].AsInteger;
      sTmp := tblMatched.Fields[1].AsString;
      tblMatched.Next;
      iTmp2 := tblMatched.Fields[0].AsInteger;
      sTmp2 := tblMatched.Fields[1].AsString;

      // Swap data
      tblMatched.Prior;
      tblMatched.Edit;
      tblMatched.Fields[0].Value := iTmp2;
      tblMatched.Fields[1].Value := sTmp2;

      tblMatched.Next;
      tblMatched.Edit;
      tblMatched.Fields[0].AsInteger := iTmp;
      tblMatched.Fields[1].AsString := sTmp;
   end;
   tblMatched.EnableControls;
end;