对不起,对于一个新的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;发布于 2016-05-04 05:47:42
如果改用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-04 21:48:26
您可以使用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的数据量。可以在connection或FireDAC query对象上设置这些属性。我通常使用静态游标来处理所有返回的结果。如果您的查询可以返回数百万行,这不是一个好的选择,但我通常只处理几千行。ADO具有类似的属性。
Query.FetchOptions.CursorKind := ckStatic;
Query.FetchOptions.Mode := fmAll;https://stackoverflow.com/questions/37011967
复制相似问题