TDataset and TMemDataset

3

我需要迭代多个MySQL查询并将它们保存在TMemDataset数组中。下面是实现代码:

MemDataset1.CopyFromDataset(ZQuery1,True); 

然而,每次查询变化时,所有以前的TMemDataset都会改变以包含新值(我猜是因为它们是“数据感知组件”)。如果我通过ZQuery1.Free摆脱ZQuery1,那么所有数据都会消失。我该如何避免这种情况发生?
我正在使用FreePascal,但我相信Delphi的解决方案也适用。

2
之前的TMem...都包含了新值。你有没有在数组中使用1个TMemDataset实例?能否展示一些填充数组和创建TMemDatasets的代码? - Arjen van der Spek
对我来说,看起来你是克隆了TClientDataSet,而不是复制。除了你代码的这一行之外,我不知道你在做什么。而且你使用了技术术语不正确。请通过重新构思你的问题并提供更多的代码和细节来使你的问题更具建设性。 - da-soft
首先,提到FPC版本。你测试过2.6.0rc1吗?第二个参数是“copy”,如果我查看代码,数据确实被复制了。所以问题是为什么它对你不起作用(以及为什么你要将FPC SQLDB类与Zeos查询一起使用?) - Marco van de Voort
1个回答

1
解决方案是拥有一个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;

这样应该可以工作,因为现在查询和内存数据集之间不再混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接