TDataset и TMemDataset - PullRequest
       22

TDataset и TMemDataset

3 голосов
/ 20 ноября 2011

Мне нужно выполнить несколько запросов MySQL и сохранить их в массиве TMemDataset. Это, кажется, делает это:

MemDataset1.CopyFromDataset(ZQuery1,True); 

Однако каждый раз, когда изменяется запрос, все предыдущие TMemDataset меняются, чтобы содержать новые значения (я полагаю, потому что они являются «компонентами, поддерживающими данные»). Если я избавлюсь от ZQuery1 с помощью ZQuery1.Free, все данные исчезнут. Как мне избежать этого?

Я использую FreePascal, но держу пари, что решение для Delphi тоже подойдет.

1 Ответ

1 голос
/ 20 мая 2012

Решение состоит в том, чтобы иметь массив ZQuery, а также массив MemDataSet

type
  TZQueries = array of TZQuery;
  TMemDataSets = array of TMemDataset;

procedure Test;
var
  ZQueries: TZQueries;
  MemDatasets: TMemDatasets;
  i: integer;
begin
  try
    SetLength(ZQueries,10);
    SetLength(MemDatasets,10);
    for i:= Low(ZQueries) to high(ZQueries) do begin
      ZQueries[i]:= TZQuery.Create;
      ZQueries[i].Connection:= ZConnection1;
      ZQueries[i].SQL.Text:= QueryTextFromSomewhere
    end; {for i} 
    for i:= Low(MemDatasets) to High(MemDatasets) do begin
      MemDatasets[i]:= TMemDataset.Create;
      ZQueries[i].Open;
      MemDatasets[i].CopyFromDataset(ZQueries[i],True);
    end; {for i}
    ....
      code to process the memdatasets
    ....
  finally
    for i = Low(ZQueries) to High(ZQueries) do begin
      ZQueries[i].Free;
    end; {for i}
    for i = Low(MemDatasets) to High(MemDatasets) do begin
      MemDatasets[i].Free;
    end; {for i}
  end; {tryf}
end;

Что-то подобное должно работать, потому что теперь больше нет путаницы между запросами и наборами данных.

...