0

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

由于某些处理很复杂,我想取而代之的是获取整个记录并将其传递给一个过程来处理远离循环的每个字段。

我认为这可能与该GetCurrentRecord()方法有关,如果它被覆盖,该方法似乎返回一个指向 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;
4

1 回答 1

0

解决方案不是尝试将指针传递给包含相关记录的缓冲区,而是传递整个查询对象。然后可以像往常一样使用 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;
于 2020-01-14T19:59:20.830 回答