小茶杯 發表於 2024-12-5 11:07:00

delphi内存表

<p>delphi内存表</p>
<p>delphi内存表最大的特点就是有data和delta属性,有了它,极大地简化了数据库CURD编程。这是其他语言所不具备的优势。</p>
<p>在当前流行软件平台化,IDL盛行的时候,可能也是其最大的缺陷。</p>
<p>就算FPC几乎山寨了整个delphi的数据集体系,但内存表的data和delta属性就是山寨不了。</p>
<p>1)TClientDataSet</p>
<p>早年datasnap基于COM,datasnap远程方法函数可以返回OLEVariant,TClientDataSet.Data和TClientDataSet.Delta的数据格式都是OLEVariant。</p>
<p>delphi数据集通过TDataSetProvider桥梁转换为OLEVariant。</p>
<p>DSP+CDS组合,firedac,unidac,ado,bde,dbx。。所有数据库引擎都支持。</p>
<p>CDS有一个惹人厌的问题,midas.dll,要是机器上有多个版本的midas.dll,简直是无限麻烦。解决方法:在工程文件 uses midas.dll。</p>
<p>CDS后来也支持linux,部署的时候,相应的要带一个特有的libmidas.so.2动态库。</p>
<p>CDS这一点是很让人诟病的。</p>
<p>1.1)查询</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      qry.Close;
      qry.SQL.Clear;
      qry.SQL.Text :</span>= req.asStr[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sql</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> i.tostring];<br>     //qry.open; //此行代码千万不能有,否则会查询二次
      result</span> := dsp.Data;</pre>
</div>
<p>1.2)保存</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      qry.Close;
      qry.SQL.Clear;
      qry.SQL.Text :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">select * from table</span><span style="color: rgba(128, 0, 0, 1)"> where 1=2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
      dsp.ApplyUpdates(delta</span>, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, err); //delta是客户端提交上来的数据
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> err &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> then
      begin
          //保存失败</span><span style="color: rgba(0, 0, 0, 1)">
      end;</span></pre>
</div>
<p>2)TFDMemTable</p>
<p>&nbsp;delphi为了支持跨OS,废掉了DBX,引入全新的firedac数据库引擎。datasnap也不再基于COM(COM势微)。</p>
<p>带来了全新的firedac内存表TFDMemTable。</p>
<p>最大的缺陷:只能使用firedac,不能支持ado,bde,dbx,unidac。。其他数据库引擎。</p>
<p>uses&nbsp;FireDAC.Stan.StorageBin, FireDAC.Stan.Intf;</p>
<p>2.1)查询</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      qry.Close;
      qry.SQL.Clear;
      qry.SQL.Text :</span>= 'select * from table'<span style="color: rgba(0, 0, 0, 1)">;
      db.qry.Open;
      TMemoryStream(ms).Clear;
      qry.SaveToStream(ms, sfBinary);</span></pre>
</div>
<p>2.2)保存</p>
<p>&nbsp;服务端</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      qry.Close;</span>
<span style="color: rgba(0, 0, 0, 1)">      qry.SQL.Clear;
      qry.SQL.Text :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">select</span><span style="color: rgba(128, 0, 0, 1)"> from table</span><span style="color: rgba(128, 0, 0, 1)"> where 1=2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
      qry.LoadFromStream(ms</span><span style="color: rgba(0, 0, 0, 1)">, sfBinary);
      err :</span>=<span style="color: rgba(0, 0, 0, 1)"> qry.ApplyUpdates;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> err &gt; <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> then
      begin
      //保存失败</span><span style="color: rgba(0, 0, 0, 1)">
      end;</span></pre>
</div>
<p>&nbsp;客户端</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">
    TFDMemTable.CachedUpdates :</span>= True;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此属性必须设置</span>
    TFDMemTable.ResourceOptions.StoreItems := TFDMemTable.ResourceOptions.StoreItems -<span style="color: rgba(0, 0, 0, 1)"> ; //只提交修改的数据
</span><span style="color: rgba(0, 0, 0, 1)">//保存失败
      TFDMemTable.CancelUpdates;
      TFDMemTable.ResourceOptions.StoreItems :</span>= TFDMemTable.ResourceOptions.StoreItems +<span style="color: rgba(0, 0, 0, 1)"> ;
</span><span style="color: rgba(0, 0, 0, 1)">//保存成功
      TFDMemTable.MergeChangeLog;</span><span style="color: rgba(0, 0, 0, 1)">
<br></span></pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18588108</p><br><br>
来源:https://www.cnblogs.com/hnxxcxg/p/18588108
頁: [1]
查看完整版本: delphi内存表