【问题标题】:How can I read a whole record at once from a TDataSet?如何从 TDataSet 一次读取整条记录?
【发布时间】:2020-01-13 14:57:01
【问题描述】:

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

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

我认为这可能与 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;

【问题讨论】:

    标签: delphi-2009 tdataset


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多