T tcx Unregistered / Unconfirmed GUEST, unregistred user! 2001-07-19 #1 tdatasetprovider的resolvetodataset属性设为false是它会自动产生sql来更新数据库,但 它是怎样来产生这个sql语句的呢?具体的产生流程?
Y yanghaijun Unregistered / Unconfirmed GUEST, unregistred user! 2001-07-19 #2 比较复杂,若想有效率,你可以让TDataSetProvider组件使用数据集组件更新数据, 再配合执行已经Prepare好的SQL叙述。
T tcx Unregistered / Unconfirmed GUEST, unregistred user! 2001-07-19 #3 我主要是想知道tdatasetprovider是怎样知道用户更新的是那一张表,如果tquery的sql为空 时
Q qiu_peking Unregistered / Unconfirmed GUEST, unregistred user! 2001-11-02 #5 它是根据客户端更新数据包来确定更新表名和需更新的记录的。 TDatasetprovider对在客户端传递过来的Delta数据包中的记录逐一扫描。如果记录更新标记 为Insert则生成Insert语句;为Update/Delete则生成相应的Update/delete语句(where条件 根据记录的oldvalue生成)。所有语句都生成好了,就在预先创建的一个内部Tdataset中执行 这些语句从而更新了数据库记录。 当然这是最一般的流程。其他如TResolveToDataset:=true,TDatasetProvider.dataset不是 TBDEDataset子类的话就将更新语句提交给TDatasetProvider.dataset执行。 大体如此。
它是根据客户端更新数据包来确定更新表名和需更新的记录的。 TDatasetprovider对在客户端传递过来的Delta数据包中的记录逐一扫描。如果记录更新标记 为Insert则生成Insert语句;为Update/Delete则生成相应的Update/delete语句(where条件 根据记录的oldvalue生成)。所有语句都生成好了,就在预先创建的一个内部Tdataset中执行 这些语句从而更新了数据库记录。 当然这是最一般的流程。其他如TResolveToDataset:=true,TDatasetProvider.dataset不是 TBDEDataset子类的话就将更新语句提交给TDatasetProvider.dataset执行。 大体如此。
L luyear Unregistered / Unconfirmed GUEST, unregistred user! 2001-11-02 #6 你可以用SQL monitor觀察一下自動產生的SQL語句 看看效率如何?
M mailhui Unregistered / Unconfirmed GUEST, unregistred user! 2001-12-08 #7 据我观察好像有以下问题: 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 刚刚测试的结果。可能有理解的问题,请指正。
据我观察好像有以下问题: 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 刚刚测试的结果。可能有理解的问题,请指正。
L langger Unregistered / Unconfirmed GUEST, unregistred user! 2001-12-10 #8 编写OnGetTableName事件,提供表名就可解决SQL为空的问题。
G gxx Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-22 #11 一般情况下,不要修改默认设置,这样组件会自动生成SQL语句来更新表,这个组件非常聪明, 如果从一个表查询,完全可以使用默认设置,如果是两个表join的结果,想更新,可以按照 langger,说的,在OnGetTableName事件中简单地指定表名就可以了,如果有多于两个以上 的表来join的结果更新,比较复杂,分两种情况:如果使用BDE,可以使用UpdataSQL控件, 非常好用。如果使用ADO,只能使用tdatasetprovider的onupdaterecord事件,在事件中 自己手工提取哪些数据更新了,再生成相应地SQL语句来更新物理表。这种方式功能最强大, 但稍微复杂一点,不过很容易掌握的。找本关于Delphi多层结构的书看看,说法都一样。
一般情况下,不要修改默认设置,这样组件会自动生成SQL语句来更新表,这个组件非常聪明, 如果从一个表查询,完全可以使用默认设置,如果是两个表join的结果,想更新,可以按照 langger,说的,在OnGetTableName事件中简单地指定表名就可以了,如果有多于两个以上 的表来join的结果更新,比较复杂,分两种情况:如果使用BDE,可以使用UpdataSQL控件, 非常好用。如果使用ADO,只能使用tdatasetprovider的onupdaterecord事件,在事件中 自己手工提取哪些数据更新了,再生成相应地SQL语句来更新物理表。这种方式功能最强大, 但稍微复杂一点,不过很容易掌握的。找本关于Delphi多层结构的书看看,说法都一样。