【问题标题】:Delphi - Loading FDMEMTableDelphi - 加载 FDMEMTable
【发布时间】:2016-05-03 18:41:53
【问题描述】:

对不起,对于一个新的 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;

【问题讨论】:

    标签: delphi fdmemtable


    【解决方案1】:

    您可以使用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;
    

    【讨论】:

      【解决方案2】:

      如果你改用 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;
      

      【讨论】:

      • FredS - 感谢您的协助。我需要其他代码的原因是增加页面大小。否则 AD 仅返回大约 900 行。 “CopyDataSet”很有趣。您将如何将 the_recordset 放在 FDMEM 表中?需要类似 IntToStr 但 _recordsetToFDMEM ...
      • OneFiveOne - 添加了 PageSize。 TAdoDataset 包含一个 ADO.Recordset。组件已经完成了到 TDataset 的转换。自 Delphi 4 以来,我不必将 ADO.Recordset 转换为 TDataset ..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多