我怎样才能一次从 TDataSet 中读取整条记录?

How can I read a whole record at once from a TDataSet?

我正在使用查询(实际上是 Devart 的 TMyQuery,继承自 TDataSet)从 mySQL 数据库中获取数据。通常我使用 fieldbyname()while not eof 循环中一次处理一个字段。

由于某些处理过程很复杂,所以我想取而代之的是获取整个记录并将其传递给一个过程,以便在循环之外对每个字段进行处理。

我认为这可能与 GetCurrentRecord() 方法有关,如果它被覆盖,该方法似乎 return 指向 Byte 的指针,但我不清楚如何从中提取我的字段指针。

如果可以的话,谁能告诉我获取一整条记录的语法,将其作为参数传递,然后提取每个字段?

我常用的代码结构

Procedure ProcessTable;
begin
    Query1.SQL.Clear;
    Query1.SQL.Add(SQL);
    Query1.Open;
    Query1.first ;
    while not Query1.Eof  do
       begin
           var1 :=  Query1.FieldByName('field1').AsString;
           var2 := Query1.FieldByName('field2').AsInteger;
           //etc.
           Query1.Next;
       end;
    Query1.close;  
end;

我想做的伪代码

procedure ProcessRecord( TheRecord : PByte );
begin
    ..
    <extract the fields from TheRecord and process them>
    ..
end;

Procedure ProcessTable;
var 
   buffer : PByte;
begin
    Query1.SQL.Clear;
    Query1.SQL.Add(SQL);
    Query1.Open;
    Query1.first ;
    while not Query1.Eof  do
       begin
       buffer := Query1.GetCurrentRecord;
       ProcessRecord(buffer);
       Query1.Next;
       end;
    Query1.close
end;

解决方案不是尝试传递指向包含相关记录的缓冲区的指针,而是传递整个查询对象。然后可以像往常一样简单地使用 FieldByName() 恢复相关记录。查询对象中包含当前指向的记录的位置,因此它不需要先提取到缓冲区中。

所以使用相同伪代码的解决方案是。

procedure ProcessRecord( TheRecord : TQuery );
var
  var1 : string;
  var2 : integer;
begin
  var1 := TheRecord .FieldByName('field1').AsString;
  var2 := TheRecord .FieldByName('field2').AsInteger;
  <process var1 and var 2>
end;

Procedure ProcessTable;
begin
    Query1.SQL.Clear;
    Query1.SQL.Add(SQL);
    Query1.Open;
    Query1.first ;
    while not Query1.Eof  do
       begin
       ProcessRecord(Query1); //pass the whole query object as type TQuery 
                              //(or in my specific case, of type TmyQuery         Query1.Next;
       end;
    Query1.close
end;