各位其实在我的回答里应该明白我的意思了,实际上UPDATESQL里有三个QUERY,每一个对应
INSERT DELETE 和MODFITY,而QUERY的SQL语句正如在UPDATESQL里所见的一样,UPDATESQL实
际上是根据UPDATEKIND执行不同的QUERY,不同的是UPDATESQL会根据CACHE里的值自动赋给
QUERY里的参数,也就是在SQL里看到的:字段名或:OLD_字段名,:字段名就是FIELD的
NEWVALUE,而:OLD_字段名就是OLDVALUE,这个给参数赋值的过程就是UPDATESQL.SETPARAMS
,而在UPDATESQL里的SQL实际上可以写任意语句,任意多条,只要遵循DELPHI的规范
(这个后面再说),现在举一个例子,假设有两个表
Table A
(A1 :int primary key
A2: string
)
Table A
(A1 :int
B1 :int
A2: string
primary (A1,B1)
)
这是一个标准的H/D关系,我现在利用一个QUERY1将两个表的数据一起选出
select A.A1,A.A2,B.B1,B.B2 from A left join B on A.A1=B.B1
然后入DBGRID,将QUERY1的CACHEUPDATES设为TRUE,
再有一个UPDATESQL1,QUERY1.updateobject:=UPDATESQL1
假设A和B的PAIMARY KEY是不能修改的
在UPDATESQL的MODFITYSQL里写
UPDATE A SET A2= :A2 where A1 = :OLD_A1
UPDATE B SET B2= :B2 where A1 = :OLD_A1 and B1= :OLD_B1
UPDATE A SET A1=A1 WHERE A1= :OLD_A1
这样就可以将GRID里的A2和B2两个不同表的数据更新回相应的表中,最后一句话是关键,
DELPHI里规定UPDATESQL执行的结果只能影响一条记录,ROWAFFECTED=1,
否则就会报错 “UPDATES FAILED”,所以你必须保证最后一条SQL语句只影响一条记录,
当然如果在大量数据更新的情况下就会影响性能,要它不报错也可以,稍微改写一下UPDATESQL控件就可以了
,继承TSQLUPDATEOBJECT写一个自己的UPDATESQL,就完全解决了问题
实际上这项功能不仅可以多表更新(现在大家肯定认为多表更新是小儿科了),还可以利用
SQL在后台创建出任何你想要的表或者字段,然后在前台将数据输入,再更新到任何你想
更新的表里,可以在INSERTSQL里写DELETE语句,在MODFITYSQL里写INSERT语句,随便你,
看以下例子
(for SQL Server 7.0)
select cast(0 as bit),cast(0 as decimal(12,5) cast(0 as int),cast('MMMMM' as char(5) from A
A 是随便什么表,无所谓,这样就得到一个自己创建的表,包含那些列,什么类型,
完全自己掌握,甚至可以动态生成,只要写好UPDATESQL就可以啦,爽吧!! ^_^
另外我自己写有UPDATESQL和知道执行影响数据行数(ROWAFFECTED)的QUERY控件,
还有两个函数,也可以返回标准QUERY和STOREDPROC的ROWAFFECTED值,
如有需要E-MAIL socket@263.net
另外100分似乎。。。 ^_^