Как я могу прочитать всю запись сразу из TDataSet? - PullRequest
0 голосов
/ 13 января 2020

Я получаю данные из базы данных mySQL, используя запрос (фактически TMyQuery от Devart, унаследованный от TDataSet). Обычно я обрабатываю одно поле за раз в while not eof l oop, используя fieldbyname().

Поскольку некоторая обработка является сложной, я вместо этого хотел бы извлечь всю запись и передать ее процедуре, выполняющей обработку каждого поля, находящегося вдали от l oop.

Я думаю, что это может быть связано с методом GetCurrentRecord(), который, похоже, возвращает указатель на байт, если он переопределен, но тогда я не совсем понимаю, как извлечь мои поля из этого указателя.

Если это возможно, кто-нибудь может показать мне синтаксис для извлечения одной целой записи, передачи ее в качестве параметра и затем извлечения каждого поля?

Структура кода, который я обычно использую

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;

1 Ответ

0 голосов
/ 14 января 2020

Решение состоит не в том, чтобы попытаться передать указатель на буфер, содержащий данную запись, а в том, чтобы передать весь объект запроса. Затем соответствующие записи можно просто восстановить с помощью 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;
...