2016-05-03 47 views
0

をロード申し訳ありませんが、以下のコードで新しいDelphi'erデルファイ - FDMEMTable

ための単純ではない、どのように私は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; 

答えて

0

あなたの代わりに

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; 
+0

フレッド - ありがとうございます。他のコードが必要な理由は、ページサイズを増やすことです。それ以外の場合、ADは約900行しか返しません。 "CopyDataSet"は面白いです。どのようにthe_recordsetをFDMEMableに置くのですか? IntToStrのようなものが必要ですが、_recordsetToFDMEM ... – OneFiveOne

+0

OneFiveOne - PageSizeが追加されました。 TAdoDatasetにはADO.Recordsetが含まれています。 TDatasetへの変換はすでにコンポーネントによって行われています。私はDelphi 4以降、ADO.RecordsetをTDatasetに変換する必要はありませんでした。 – FredS

0

あなたがMemTableから電話をかけると、それにクエリを渡すCloneCursor

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

を使用することができるのTADODataSetを使用する場合、これは簡単です。これにより、行/フィールドごとに行をコピーする必要なく、2つのオブジェクト間でデータが共有されます。

MemTable.CloneCursor(QueryDataSet, false, false); 

なぜMemTableとTFDQueryオブジェクトのデータを必要としたのか、あなたは言っていませんでした。これが便利な時がありますが、唯一の理由が返されたTFDQueryオブジェクトを使用するだけで、クエリの結果を戻すことができる場合です。両方のオブジェクトは、使用方法がほぼ同じです。 TFDQueryオブジェクトはデータベースに接続したままで、変更をデータベースにプッシュバックすることができます。

Page Sizeに関するあなたのコメントに基づいて、FetchOptions CursorKindとModeのプロパティも見てください。これらは、一度にQueryObjectに返されるデータ量を制御するのに役立ちます。これらは、接続またはFireDACクエリオブジェクトのいずれかで設定できます。私は通常、すべての結果が返されるStaticカーソルを使用します。クエリが良い選択ではない何百万もの行を返すことができますが、私は通常、数千行しか扱っていません。 ADOにも同様の特性があります。

Query.FetchOptions.CursorKind := ckStatic; 
Query.FetchOptions.Mode := fmAll;