四面十方 發表於 2024-11-16 15:17:00

delphi 新版内存表 FDMemTable

<p>c++builder XE</p>
<p>官方demo最全60多个</p>
<p>http://community.embarcadero.com/blogs?view=entry&amp;id=8761</p>
<p>&nbsp;</p>
<p>&nbsp;FireDAC.Comp.Client</p>
<p>&nbsp;</p>
<p>用好FDMemTable代替之前的ClientDataSet,以前ClientDataSet内存表转换太繁琐了步骤。</p>
<p>&nbsp;TClientDataSet *cds = new TClientDataSet(this);<br>&nbsp;&nbsp;DataSetProvider1-&gt;DataSet = dm-&gt;ADOQueryPub;<br>&nbsp;&nbsp;cds-&gt;ProviderName = "DataSetProvider1";<br>&nbsp;&nbsp;cds-&gt;Open();</p>
<p>&nbsp;</p>
<p>c++智能指针</p>
<p>&nbsp;#include &lt;memory&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//For STL auto_ptr class</p>
<p>std::auto_ptr&lt;TFDMemTable&gt; table (new TFDMemTable(NULL));</p>
<p>for (table-&gt;First(); !table-&gt;Eof; table-&gt;Next())</p>
<p>{</p>
<p>table-&gt;FieldByName("aa")-&gt;AsString;</p>
<p>}</p>
<p>&nbsp;</p>
<p>一句就可以了</p>
<p>FDMemTable1-&gt;CopyDataSet(dm-&gt;ADOQueryPub, TFDCopyDataSetOptions() &lt;&lt; coStructure &lt;&lt; coRestart &lt;&lt; coAppend);</p>
<p>&nbsp;</p>
<p>多用FDMemTable,不再用ClientDataSet\DataSetProvider1做转换了</p>
<p>FDMemTable2-&gt;Data = FDMemTable1-&gt;Data;</p>
<p>FDMemTable2-&gt;CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() &lt;&lt; coStructure &lt;&lt; coRestart &lt;&lt; coAppend);</p>
<p>&nbsp;</p>
<p><strong>建立缓存表</strong></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre>FDMemTable1.Close();
FDMemTable1.FieldDefs.Clear();
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, True);
FDMemTable1.FieldDefs.Add('Name', ftString, 20, false);
FDMemTable1.CreateDataSet();
FDMemTable1.AppendRecord();
FDMemTable1.AppendRecord();
FDMemTable1.AppendRecord();</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://assets.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p>&nbsp;</p>
<p><strong>0)FDMemTable1.SourceView遍历各行数据,取任意行数据无需Next移动指针了。TFDDatSView</strong></p>
<p>&nbsp;for (int i = 0; i &lt; FDMemTable1-&gt;SourceView-&gt;Rows-&gt;Count; i++)<br>&nbsp;{<br>&nbsp;&nbsp;Caption = FDMemTable1-&gt;SourceView-&gt;Rows-&gt;ItemsI-&gt;GetData(1);<br>&nbsp;}</p>
<p>FDMemTable1-&gt;SourceView-&gt;Rows-&gt;ItemsI-&gt;GetData("fieldName");//取指定行指定字段名的值<br>&nbsp;}</p>
<p><strong>9行7列的值。</strong></p>
<p>&nbsp;FDMemTable1.Data.DataView.Rows.ItemsI.ValueI;</p>
<p>&nbsp;FDMemTable1.Table.Rows.ValueI</p>
<p>&nbsp;Caption = FDMemTable1-&gt;SourceView-&gt;Rows-&gt;Count;//过滤后1条<br>&nbsp;Caption = FDMemTable1-&gt;Table-&gt;Rows-&gt;Count;//过滤无效,全部记录3条</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>iMax := 0;
for i := 0 to FDQuery1.SourceView.Rows.Count - 1 do
if FDQuery1.SourceView.Rows.GetData('id', @iVal) and (iVal &gt; iMax) then
    iMax := iVal</pre>
</div>
<p>&nbsp;</p>
<p><strong>数据集拷贝,复制数据集,合并数据集<br></strong></p>
<p>&nbsp;FDMemTable1-&gt;Filter = "id=102";<br>&nbsp;FDMemTable1-&gt;Filtered = true;</p>
<p>FDMemTable1只有1条记录</p>
<p><strong>&nbsp;1)Data</strong></p>
<p>FDMemTable2-&gt;Data = FDMemTable1-&gt;Data;</p>
<p>&nbsp;</p>
<p>FDQuery-&gt;Open("select * from tt");</p>
<p>FDMemTable2-&gt;Data = FDQuery-&gt;Data;</p>
<p>&nbsp;</p>
<p>FDMemTable2是全部记录,有3条记录。</p>
<p>FDMemTable1-&gt;Delete();后的记录不在Data里。</p>
<p><strong>&nbsp;2)CopyDataSet</strong></p>
<p><strong>带结构拷贝<br></strong></p>
<p>FDMemTable2-&gt;CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() &lt;&lt; coStructure &lt;&lt; coRestart &lt;&lt; coAppend);</p>
<p>&nbsp;FDMemTable2-&gt;CommitUpdates();</p>
<p>缓存更新用到changeCount,所以copy完后加上CommitUpdates</p>
<p>&nbsp;</p>
<p><strong>不带结构,仅拷贝数据,字段个数可以不一致,字段数以目标数据集FDMemTable2为标准。</strong></p>
<p>FDMemTable2-&gt;CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() &lt;&lt;&nbsp; coRestart &lt;&lt; coAppend);</p>
<p>//第二个参数默认是coRestart &lt;&lt; coAppend,所以下面就更简单了。</p>
<p>FDMemTable2-&gt;CopyDataSet(FDMemTable1);</p>
<p>FDMemTable2只有1条记录</p>
<p><strong>&nbsp;3)CopyRecord\CopyField</strong></p>
<p>copy the current record field values .Only One Record</p>
<p>&nbsp;&nbsp;FDMemTable2-&gt;CopyDataSet(FDMemTable1, TFDCopyDataSetOptions() &lt;&lt; coStructure);<br>&nbsp;FDMemTable2-&gt;Edit();<br>&nbsp;FDMemTable2-&gt;CopyRecord(FDMemTable1);</p>
<p><strong>&nbsp;4)CloneCursor</strong></p>
<p>All Record, ignore filter</p>
<p>CloneCursor,数据共享,一个修改,另一个也修改了,但是FDMemTable1-&gt;Close之后FDMemTable2还正常显示。</p>
<p>FDMemTable2-&gt;CloneCursor( FDMemTable1);</p>
<p>&nbsp;2016.3.4 test 不能排序,FDMemTable2-&gt;IndexFieldNames = "ID";不起作用,所以尽量不建议用这个方式。</p>
<p><strong>5)AtrachTable</strong></p>
<p>All Record,ignore filter,TFDDatSTable</p>
<p>&nbsp;FDMemTable2-&gt;AttachTable(FDMemTable1-&gt;Table, NULL);</p>
<p>//or</p>
<p>//FDMemTable2-&gt;AttachTable(FDMemTable1-&gt;Table,FDMemTable1-&gt;View);<br>&nbsp;FDMemTable2-&gt;Open();</p>
<p><strong>6)FilteredData</strong></p>
<pre class="Element12">FDQuery1.Filter := 'upper(name) like ''D%''';
FDQuery1.Filtered := True;
<em>// copy to FDMemTable1 all FDQuery1 visible (where name starts from D) records</em>
FDMemTable1.Data := FDQuery1.FilteredData;<br><br>RecordCount是过滤后的记录数。过滤前有100行,过滤后有5行,那么RecordCount就是5<br>FDQuery1-&gt;Data是100行,FilteredData是5行的数据<br><strong>7)XMLData<br></strong>All Record ignore filter<br>&nbsp;Memo1-&gt;Text = FDMemTable1-&gt;XMLData;<br>&nbsp;FDMemTable2-&gt;XMLData = Memo1-&gt;Text;<br><br>FDMemTable1-&gt;ChangeCount,<br>通过Data赋值,默认全部记录都是修改过的,也就是ChangeCount=RecordCount,有100条记录,获取ChangeCount属性就是100.这样合适还是不合适呢?<br>FDMemTable1-&gt;Data = FDQuery-&gt;Data;<br>FDMemTable1-&gt;CancelUpdates();或者FDMemTable1-&gt;CommitUpdates();<br>加上CancelUpdates这句话,ChangeCount就正常了!!反应真实的修改记录数。<br>Append的记录需要把属性CachedUpdates设为true,ChangeCount就正确了。<br><strong>8)Delta<br>IFDDataSetReference类型</strong><br>FDMemTable2-&gt;Delta= FDMemTable1-&gt;Delta;<br><br>ADMemTable1<span class="sy1">.<span class="me1">FilterChanges <span class="sy1">:<span class="sy3">= <span class="br0"><span class="sy1">; <br>ADMemTable1<span class="sy1">.<span class="me1">Data <span class="sy1">:<span class="sy3">= ADQuery1<span class="sy1">.<span class="me1">Delta<span class="sy1">;<br><br><strong>9)查看删除过的记录UpdateStatus</strong><br><br><strong>FDMemTable想要找到并显示删除的记录</strong><br>   FDMemTable1-&gt;Delete();<br>&nbsp;&nbsp;&nbsp;FDMemTable2-&gt;FilterChanges &lt;&lt; Firedac::Comp::Dataset::rtDeleted;<br>&nbsp;&nbsp;&nbsp;FDMemTable1-&gt;Data = FDMemTable1-&gt;Data; <br>while (!FDMemTable1.eof)<br>{<br>if( table-&gt;UpdateStatus() == usDeleted)<br>...<br>}<br>默认是不显示删除过的记录的,FilterChanges不包括rtDeleted属性。<br><strong>10)分页及加载全部页</strong><br>FetchOptions的Mode默认是fmOnDemand表示分页,每页50,改为fmAll表示全部记录。<br>分页TFDFetchOptions.RowsetSize<br>FetchNext<br>FetchAll<br>FetchOptions.RecordCountMode property<br><br>FDQuery1.Open;<br>FDQuery1.FetchAll;//必须加这一句,否则数据集不全。<br>FDMemTable1.Data := FDQuery1.Data;<br>用了grideh,为何导致分页不灵了???全部记录出来了?field设置了ftsum导致,不设置每次就50行记录。<br><br>LocateEx<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="sy1"><span class="sy3"><span class="st0"><span class="sy1"><span class="sy1"><span class="me1"><span class="sy1"><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="br0"><span class="sy1"><span class="me1"><span class="br0"><span class="br0"><span class="sy1"><span class="sy1"><span class="br0"><span class="sy1">11)增强的Locate功能<span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="sy1"><span class="sy3"><span class="st0"><span class="sy1"><span class="sy1"><span class="me1"><span class="sy1"><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="sy1"><span class="me1"><span class="br0"><span class="sy1"><span class="me1"><span class="br0"><span class="br0"><span class="sy1"><span class="sy1"><span class="br0"><span class="sy1"><span class="me1">LocateEx、<span class="me1">LookupEx函数</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<pre class="Element12">lxoCheckOnly &nbsp;If included, then LocateEx does not:</pre>
<pre class="Element12">Change the current position. Fire BeforeScroll / AfterScroll events. Finish editing mode<br>不改变位置和编辑状态的搜索,强大!<br><br>&nbsp;&nbsp; if (ds1-&gt;LocateEx("DM", "001", TFDDataSetLocateOptions() &lt;&lt; lxoCheckOnly))<br><strong>12)刷新数据集</strong><br>query1.Refresh();<br><br><strong>13)只读字段</strong><br>select'' as temp,flag=0,sql返回的虚拟字段,以前clientDataSet可以修改,FDMemTable里不能改了。<br>ClientDataSet1-&gt;FieldByName("flag")-&gt;AsString="1";<br>但是FDMemTable不能改了。怎么办?以前的这种虚拟字段的方式挺好用啊。<br>解决办法:设置属性TFDMemTable.UpdateOptions.CheckReadonly=true<br><br><strong>14)主从表关系</strong></pre>
<pre class="Element12">第一步:<br>fdqueryDetail.MasterSource := DataSource1;<br>第二步:<br> fdqueryDetail.MasterFields := 'OrderNo'; { 多个字段时用分号隔开 }<br>或者<br>fdqueryDetail.sql.text='select&nbsp;*&nbsp;from&nbsp;OrderDetail&nbsp;where&nbsp;OrderMasterKey=:OrderMasterKey';<br><br>两个FDMemTable做主从怎么不起作用呢?<br><br><strong>15)过滤数据FilterChanges</strong><br>只显示修改后的数据<br>ClientDataSet1-&gt;FilterChanges = TFDUpdateRecordTypes() &lt;&lt; Firedac::Comp::Dataset::rtModified;<br><br>ClientDatSet用Grideh可以排序,添加EhLibCDS.pas文件即可。<br>TFDMemTable添加EhLibFireDAC.pas怎么不起不能排序,报错TFDMemTable is not SQL based dataset,FDQuery排序可以了<br>把SortLocal=true,也不能排序,报错 TSQLDatasetFeaturesEh can not sort data in dataset "FDMemTable1" in local mode<br>TFDMemTable不能排序,ClientDatSet替换为TFDMemTable的进程又得延缓.<br>比较和跟踪源码,Delphi里TFDMemTable排序正常。c++builder新建一个工程添加内存表和数据也排序正常。<br><br>最终解决了,原来是旧的ehlib控件卸载不干净,原来的工程里还有路径和ehlib.lib文件的链接,清除后排序全部OK!<br><br>2019.4.1 一个界面A 排序报错TFDMemTable is not SQL based dataset,弹出窗口排序正确,为什么呢,</pre>
<pre class="highlighter-hljs"><code class="highlighter-hljs hljs language-undefined">FDQuery.Fields.DataSet</code> ?这也是数据集?<br><span dir="ltr">Data.DB.TFields.DataSet<br>Identifies the dataset to which a TFields object belongs.</span></pre>
<pre class="Element12">&nbsp;A DataTable or a DataView must be supplied. Hint: if that is TFDMemTable, use CreateDataSet or CloneCursor to open dataset<br><br>TFDDataSet 基类<br><br>fdquery,dbgrideh控件的ftsum字段求和影响<br><br>C++Builder 返回数据集<br>_di_IFDDataSetReference<br><br><strong>16)已有数据的FDMemTable添加列,动态添加列<br>原有数据集,现有数据集,现有字段,原有字段,添加新增选择列</strong><br>&nbsp; FDMemTable2.FieldDefs := FDMemTable1.FieldDefs;<br>&nbsp; FDMemTable2.FieldDefs.Add('Test', ftString, 20 { , False } ); // default parameter<br>&nbsp; FDMemTable2.FieldDefs.Find('Test').Index := 0;<br>&nbsp; FDMemTable2.CreateDataSet; // or just Open that sets Active to true;<br>&nbsp; FDMemTable2.CopyDataSet(FDMemTable1);<br><br>17)缓存更新<br>FDMemTable1-&gt;ChangeCount <br>执行了ApplyUpdates或CommitUpdates后ChangeCount变为0<br>FDMemTable1-&gt;ApplyUpdates(0);<br><br><strong>C++builder Berlin//Berlin 排序无效</strong> 2017.3.12<br>delphi正常<br><br>升序<br>self.FDMemTable1.IndexFieldNames := 'ID:A';<br><br>降序<br>self.FDMemTable1.IndexFieldNames := 'ID:D';<br><br>FDMemTable1-&gt;IndexFieldNames = "ID:D";<br><br><br>FDMemTable1-&gt;CloneCursor(m-&gt;dsModule, true, true);</pre>
<pre class="Element12">CloneCurso的数据集均无法用IndexFieldNames排序。用CreateDataSet创建的数据集排序正常!<br><br>Data赋值、CopyDataSet后的数据集均排序可以正常。建议不用CloneCursor。<br><br><br><strong>18.修改只读字段</strong><br>query1.UpdateOptions.AssignedValues = <br>&nbsp;&nbsp;&nbsp; FDStoredProc1-&gt;UpdateOptions-&gt;CheckReadOnly = false;<br><br></pre>
<pre class="prettyprint"><strong>TSQLTimeStampField</strong><br>ClientDataSet1: Type mismatch for field 'ffdatetimie', expecting: DateTime actual: TimeStamp<br>TDateTimeField<br>TDateTime 替换为<br>TSQLTimeStampField<br><br><strong>FMTBcd</strong><br>ds1: Type mismatch for field 'UNITPRICE', expecting: Float actual: FMTBcd.<br>TFloatField *ds1UNITPRICE;<br>TBCDField<br>替换为<br>TFMTBCDField<br><br> numeric(18,0)&nbsp;&nbsp; TFMTBCDField<br> decimal(18,4)&nbsp; TBCDField<br>ff3 decimal(18,3) TFMTBCDField<br>可能fdquery认为4位小数就设计器添加到字段列表是TBCDField,非4位小数就是TFMTBCDField,包括0 1 2 3 位小数。<br><strong>19.<code class="has-numbering">建立索引</code></strong></pre>
<pre><span class="k"><br>&nbsp; FDQueryRelation.AddIndex('index1','ITEMTYPE;ITEMNOHIS','', []);<br><br>&nbsp; FDQueryRelation.IndexName := 'index1';<br><br>经过试验证明,filter没有使用索引,支持like表达式<br>&nbsp; locate和findkey使用了索引,精确定位,要求检索速度快,检验使用<br></span></pre>
<pre class="Element12"><strong>Caching_Updates_</strong></pre>
<pre class="Element12"><br>http://docwiki.embarcadero.com/RADStudio/Rio/en/Caching_Updates_(FireDAC)</pre>
<pre><span class="n">FDQuery1<span class="o">.<span class="n">CachedUpdates <span class="o">:= <span class="k">True<span class="o">;
<span class="n">iSavePoint <span class="o">:= <span class="n">FDQuery1<span class="o">.<span class="n">SavePoint<span class="o">;
<span class="k">try
<span class="n">FDQuery1<span class="o">.<span class="n">Append<span class="o">;
<span class="o">...
<span class="n">FDQuery1<span class="o">.<span class="n">Post<span class="o">;
<span class="n">FDQuery1<span class="o">.<span class="n">Append<span class="o">;
<span class="o">...
<span class="n">FDQuery1<span class="o">.<span class="n">Post<span class="o">;
<span class="n">FDQuery1<span class="o">.<span class="n">Append<span class="o">;
<span class="o">...
<span class="n">FDQuery1<span class="o">.<span class="n">Post<span class="o">;
<span class="k">except
<span class="n">FDQuery<span class="o">.<span class="n">SavePoint <span class="o">:= <span class="n">iSavePoint<span class="o">;
<span class="k">end<span class="o">;<br><br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre><span class="n">FDQuery1<span class="o">.<span class="n">CachedUpdates <span class="o">:= <span class="k">True<span class="o">;
<span class="n">FDQuery1<span class="o">.<span class="n">Append<span class="o">;
<span class="o">...
<span class="n">FDQuery1<span class="o">.<span class="n">Post<span class="o">;
<span class="n">FDQuery1<span class="o">.<span class="n">Append<span class="o">;
<span class="o">...
<span class="n">FDQuery1<span class="o">.<span class="n">Post<span class="o">;
<span class="n">FDQuery1<span class="o">.<span class="n">Append<span class="o">;
<span class="o">...
<span class="n">FDQuery1<span class="o">.<span class="n">Post<span class="o">;
<span class="n">FDConnection1<span class="o">.<span class="n">StartTransaction<span class="o">;
<span class="n">iErrors <span class="o">:= <span class="n">FDQuery1<span class="o">.<span class="n">ApplyUpdates<span class="o">;
<span class="k">if <span class="n">iErrors <span class="o">= <span class="mi">0 <span class="k">then <span class="k">begin
<span class="n">FDQuery1<span class="o">.<span class="n">CommitUpdates<span class="o">;
<span class="n">FDConnection1<span class="o">.<span class="n">Commit<span class="o">;
<span class="k">end
<span class="k">else
<span class="n">FDConnection1<span class="o">.<span class="n">Rollback<span class="o">;<br><br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre><span class="k">var
<span class="n">oErr<span class="o">: <span class="n">EFDException<span class="o">;
<span class="o">...
<span class="k">if <span class="n">FDQuery1<span class="o">.<span class="n">ApplyUpdates <span class="o">&gt; <span class="mi">0 <span class="k">then <span class="k">begin
<span class="n">FDQuery1<span class="o">.<span class="n">FilterChanges <span class="o">:= <span class="p">[<span class="n">rtModified<span class="o">, <span class="n">rtInserted<span class="o">, <span class="n">rtDeleted<span class="o">, <span class="n">rtHasErrors<span class="p">]<span class="o">;
<span class="k">try
    <span class="n">FDQuery1<span class="o">.<span class="n">First<span class="o">;
    <span class="k">while <span class="k">not <span class="n">FDQuery1<span class="o">.<span class="n">Eof <span class="k">do <span class="k">begin
      <span class="n">oErr <span class="o">:= <span class="n">FDQuery1<span class="o">.<span class="n">RowError<span class="o">;
      <span class="k">if <span class="n">oErr <span class="o">&lt;&gt; <span class="k">nil <span class="k">then <span class="k">begin
      <span class="c1">// process exception object
      <span class="o">...
      <span class="k">end<span class="o">;
      <span class="n">FDQuery1<span class="o">.<span class="n">Next<span class="o">;
    <span class="k">end<span class="o">;
<span class="k">finally
    <span class="n">FDQuery1<span class="o">.<span class="n">FilterChanges <span class="o">:= <span class="p">[<span class="n">rtUnmodified<span class="o">, <span class="n">rtModified<span class="o">, <span class="n">rtInserted<span class="p">]<span class="o">;
<span class="k">end<span class="o">;
<span class="k">end<span class="o">;<br><strong>19)AppendData</strong><br>2个完全一样的数据集合并 AppendData<br>ADOQuery1-&gt;AppendData(ADOQuery2-&gt;Data );<br>不用循环遍历了,一行命令搞定<br><br><br>void __fastcall Tfrm::ds1UpdateError(TDataSet *ASender, EFDException *AException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TFDDatSRow *ARow, TFDUpdateRequest ARequest, TFDErrorAction &amp;AAction)<br><br>{<br>throw new Exception(&nbsp; AException-&gt;Message );<br>}<br><br><strong>20.fdmemtable批量编辑性能优化<br></strong>http://docwiki.embarcadero.com/RADStudio/Rio/en/TFDMemTable_Questions<br>例如 Set the following properties LogChanges, FetchOptions, ResourceOptions, and UpdateOptions.<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre><span class="n">FDMemTable1<span class="o">.<span class="n">LogChanges <span class="o">:= <span class="k">False<span class="o">;
<span class="n">FDMemTable1<span class="o">.<span class="n">FetchOptions<span class="o">.<span class="n">RecsMax <span class="o">:= <span class="mi">300000<span class="o">;<span class="c1">//Sample value
<span class="n">FDMemTable1<span class="o">.<span class="n">ResourceOptions<span class="o">.<span class="n">SilentMode <span class="o">:= <span class="k">True<span class="o">;
<span class="n">FDMemTable1<span class="o">.<span class="n">UpdateOptions<span class="o">.<span class="n">LockMode <span class="o">:= <span class="n">lmNone<span class="o">;
<span class="n">FDMemTable1<span class="o">.<span class="n">UpdateOptions<span class="o">.<span class="n">LockPoint <span class="o">:= <span class="n">lpDeferred<span class="o">;
<span class="n">FDMemTable1<span class="o">.<span class="n">UpdateOptions<span class="o">.<span class="n">FetchGeneratorsPoint <span class="o">:= <span class="n">gpImmediate<span class="o">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>Then surround massive edition operations into&nbsp;BeginBatch&nbsp;/&nbsp;EndBatch&nbsp;method calls:</p>
<div class="mw-highlight mw-content-ltr" dir="ltr">
<pre><span class="n">FDMemTable1<span class="o">.<span class="n">BeginBatch<span class="o">;
<span class="k">try
    <span class="k">for <span class="n">i <span class="o">:= <span class="mi">1 <span class="k">to <span class="mi">1000 <span class="k">do <span class="k">begin
      <span class="n">FDMemTable1<span class="o">.<span class="n">Append<span class="o">;
      <span class="c1">// ...
      <span class="n">FDMemTable1<span class="o">.<span class="n">Post<span class="o">;
    <span class="k">end<span class="o">;
<span class="k">finally
    <span class="n">FDMemTable1<span class="o">.<span class="n">EndBatch<span class="o">;
<span class="k">end<span class="o">;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</div>
<pre><span class="k"><br>c#<br>DataTable dataFee;<br>DataRow[] drRerr =&nbsp;&nbsp; dataFee.Select("目录类别=''");<br><br><em><strong>复制表有两种方法</strong></em><br>
DataTable.Clone()只克隆表结构<br>
DataTable.Copy()   克隆表结构及数据<br><br></span></pre>
<div class="chat-gpt-quick-query-container">
<div class="css-c8nnzp ant-app h-full">
<div class="sider-code-explain-button-wrapper-common">
<div class="absolute right-0 top-2 pr-2 h-">
<div class="sider-code-explain-button">
<div class="button explain-button">
<div>解释</div>
</div>
<div class="inline-flex-center cursor-pointer text-[--gpts-primary-content-text-color] button copy-button">&nbsp;</div>
<div class="vertical-divider">&nbsp;</div>
</div>
</div>
</div>
</div>
</div>
<pre class="prettyprint highlighter-hljs"><code class="has-numbering highlighter-hljs hljs language-csharp">&nbsp;DataTable dt2 = dt.Clone();
&nbsp;<span class="hljs-keyword">var rows = dataFee.Select(<span class="hljs-string">"col3&gt;=30", <span class="hljs-string">"col3 desc");

<span class="hljs-keyword">if (rows != <span class="hljs-literal">null &amp;&amp; rows.Length &gt; <span class="hljs-number">0)
&nbsp; {
&nbsp;&nbsp; <span class="hljs-keyword">foreach (DataRow row <span class="hljs-keyword">in rows)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dt2.ImportRow(row);
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp; }


</span></span></span></span></span></span></span></span></code></pre>
<pre><strong>FDConnection1一句话执行SQL</strong></pre>
<div class="cnblogs_code">
<pre>FDConnection1.ExecSQL('truncate table tab1');
FDConnection1.ExecSQL('drop table tab2', True);
FDConnection1.ExecSQL('delete from mytab where id &gt; :p1', );
FDConnection1.ExecSQL('update mytab where id = :p1 set blobfld = :blb',
, );</pre>
</div>
<pre class="prettyprint highlighter-hljs"><code class="has-numbering highlighter-hljs hljs language-undefined"></code></pre>
<p><strong>多表查询更新</strong></p>
<div class="chat-gpt-quick-query-container">
<div class="css-c8nnzp ant-app h-full">
<div class="sider-code-explain-button-wrapper-common">
<div class="absolute right-0 top-2 pr-2 h-">
<div class="sider-code-explain-button">
<div class="button explain-button">
<div>解释</div>
</div>
<div class="inline-flex-center cursor-pointer text-[--gpts-primary-content-text-color] button copy-button">&nbsp;</div>
<div class="vertical-divider">&nbsp;</div>
</div>
</div>
</div>
</div>
</div>
<pre class="prettyprint highlighter-hljs"><code class="has-numbering highlighter-hljs hljs language-go">&nbsp;FDQuery1-&gt;UpdateOptions-&gt;UpdateTableName=<span class="hljs-string">"T_USER_B";<span class="hljs-comment">//联合查询 更新指定的表
FDQuery1-&gt;FieldByName(<span class="hljs-string">"NAME")-&gt;ProviderFlags.Clear();<span class="hljs-comment">//不更新该字段

克隆
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FClonedDataSet := Table.FDataSet.GetClonedDataSet(True);
&nbsp;&nbsp;&nbsp; <span class="hljs-keyword">if FClonedDataSet = <span class="hljs-literal">nil then begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FClonedDataSet := TFDMemTable.Create(<span class="hljs-literal">nil);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TFDMemTable(FClonedDataSet).CopyDataSet(Table.FDataSet, [coStructure, coCalcFields,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; coRestart, coAppend, coIndexesCopy, coConstraintsCopy, coAggregatesCopy]);</span></span></span></span></span></span></span></code></pre><br><br>
来源:https://www.cnblogs.com/Thenext/p/18549376
頁: [1]
查看完整版本: delphi 新版内存表 FDMemTable