三层结构中一个数据更新的问题。值得探讨(100分)

  • 主题发起人 主题发起人 tcx
  • 开始时间 开始时间
T

tcx

Unregistered / Unconfirmed
GUEST, unregistred user!
tdatasetprovider的resolvetodataset属性设为false是它会自动产生sql来更新数据库,但
它是怎样来产生这个sql语句的呢?具体的产生流程?
 
比较复杂,若想有效率,你可以让TDataSetProvider组件使用数据集组件更新数据,
再配合执行已经Prepare好的SQL叙述。
 
我主要是想知道tdatasetprovider是怎样知道用户更新的是那一张表,如果tquery的sql为空
 
它是根据客户端更新数据包来确定更新表名和需更新的记录的。
TDatasetprovider对在客户端传递过来的Delta数据包中的记录逐一扫描。如果记录更新标记
为Insert则生成Insert语句;为Update/Delete则生成相应的Update/delete语句(where条件
根据记录的oldvalue生成)。所有语句都生成好了,就在预先创建的一个内部Tdataset中执行
这些语句从而更新了数据库记录。
当然这是最一般的流程。其他如TResolveToDataset:=true,TDatasetProvider.dataset不是
TBDEDataset子类的话就将更新语句提交给TDatasetProvider.dataset执行。
大体如此。
 
你可以用SQL monitor觀察一下自動產生的SQL語句
看看效率如何?
 
据我观察好像有以下问题:
1:如果DataSet 的 SQL语句为空 更新失败,报告 不存在...字段
2:resolvetodataset 设为True 则DataSet 中的SQL语句
必须可以打开要更新的这条记录,例如:SQL语句如下
Select * From aaa Where 1=2 (打开空记录) 则更新失败
提示:数据已被其它用户更改
3:resolvetodataset 设为 False 不存在上述问题。
4:观察 更新SQL语句,DataSet 的SQL打开的是哪一个表,产生的更新语句
就更新那个表。如果多个ClientDataSet 连接 一个TDataSetProvider
取不同的表,则更新可能失败。
这是我用ADO + SQL2000 Delphi 5 刚刚测试的结果。可能有理解的问题,请指正。
 
编写OnGetTableName事件,提供表名就可解决SQL为空的问题。
 
我不懂哦,我也想知道同样的问题答案
 
我也想了解!
 
一般情况下,不要修改默认设置,这样组件会自动生成SQL语句来更新表,这个组件非常聪明,
如果从一个表查询,完全可以使用默认设置,如果是两个表join的结果,想更新,可以按照
langger,说的,在OnGetTableName事件中简单地指定表名就可以了,如果有多于两个以上
的表来join的结果更新,比较复杂,分两种情况:如果使用BDE,可以使用UpdataSQL控件,
非常好用。如果使用ADO,只能使用tdatasetprovider的onupdaterecord事件,在事件中
自己手工提取哪些数据更新了,再生成相应地SQL语句来更新物理表。这种方式功能最强大,
但稍微复杂一点,不过很容易掌握的。找本关于Delphi多层结构的书看看,说法都一样。
 
后退
顶部