0

对不起,对于一个新的 Delphi'er 来说并不简单

在下面的代码中,如何将结果移动到 fdmemtable?

• 我是否必须循环添加每条记录,或者是否可以使用函数/过程将memtable 设置为等于记录集?

• 或者,是否可以将结果直接发送到 fdmemtable?

我对这段代码的问题是 cmd.execute 正在返回一个记录集,但这不是 memTable 正在寻找的类型。需要协助。

procedure TForm1.btnADReadClick(Sender: TObject);
var // SQLad,DOMAINad,USERad:string;
    t:_recordset;
begin
  DOMAINad:= QuotedStr('LDAP://')+DOMAINad;
  //listbox1.Clear;
  try
    datamodule1.connADOldap.ConnectionString := 'Provider=ADsDSOObject';
    cmd.Connection:=datamodule1.connADOldap;
    datamodule1.connADOldap.Connected:=true;
    SQLad:='select cn,distinguishedname from '+DOMAINad+' where objectClass='
    //+Quotedstr('*');
    +Quotedstr('user');
    //
    cmd.CommandText:=SQLad;
    cmd.Properties.Item['Page Size'].Value:=40;
    //t:=cmd.Execute;
    datamodule1.FDMemTableADResults:=cmd.Execute;
  except
   on exception do showmessage('Error');
  end;

end;
4

2 回答 2

0

您可以使用CloneCursor

procedure CloneCursor(ASource: TFDDataSet; AReset: Boolean = False;  AKeepSettings: Boolean = False); 

您从 MemTable 进行调用并将查询传递给它。这将在两个对象之间共享数据,而无需逐行/逐字段地复制它。

MemTable.CloneCursor(QueryDataSet, false, false);

你没有说为什么你想要 MemTable 和 TFDQuery 对象中的数据。有时这很有用,但如果您的唯一原因是获取查询结果,只需使用返回的 TFDQuery 对象。这两个对象的用途几乎相同。TFDQuery 对象可以保持与数据库的连接,以便您所做的更改可以推送回数据库。

根据您对页面大小的评论,您还应该查看 FetchOptions CursorKind 和 Mode 属性。这些有助于控制一次将多少数据返回到 QueryObject 中。这些可以在连接或 FireDAC 查询对象上设置。我通常使用返回所有结果的静态游标。如果您查询可以返回数百万行,这不是一个好的选择,但我通常只处理几千行。ADO 具有类似的特性。

Query.FetchOptions.CursorKind := ckStatic;
Query.FetchOptions.Mode := fmAll;
于 2016-05-04T13:48:25.523 回答
0

如果您改用 TADODataSet,这会更简单

  ADODataSet1.ConnectionString := 'Provider=ADsDSOObject';
  ADODataSet1.CommandText := 'select cn, distinguishedname from ''LDAP://HOME'' where objectClass=''*''';
  ADODataSet1.Open;
  ADODataSet1.Recordset.PageSize :=40; // << Edit
  FDMemTable1.CopyDataSet(ADODataSet1, [coStructure, coRestart, coAppend]);
  FDMemTable1.Open;
于 2016-05-03T21:47:41.913 回答