简单的问题,帮别人问的,(50分)

烂泥

Unregistered / Unconfirmed
GUEST, unregistred user!
1。现在我用DBgrid通过Datasource与一个ADOQuery相连,实现浏览数据集的操作很简单,
但如果我想修改,插入,删除记录,我通过DBgrid可以实现同时对多表的更新吗?
还有,如果在修改多条记录后执行cancel,我想要用到事务,我应该在什么事件里处理?

2。用Actionlist时,MDI子窗口的Action可以被主窗口使用吗
 
1、老兄!不可的,对试图的更新只能对单表操作。
2、没有太多研究。
 
1.绝对可以,ADO很了不起的一项功能就是可以进行多表更新,很爽的,
因为是多表更新, 要自己写事件控制语句,保证完整提交。
2.没试过,但我认为可以,自己可以试试。
 
绝对可以,请参考
来自:zhuhuan, 时间:2000-8-17 21:01:20, ID:311803
各位其实在我的回答里应该明白我的意思了,实际上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
 
多人接受答案了。
 
顶部