怎样将多个数据库中的字段提出并修改后返回各自的数据库中?(100分)

  • 主题发起人 主题发起人 jwa
  • 开始时间 开始时间
J

jwa

Unregistered / Unconfirmed
GUEST, unregistred user!
见题。比如:有两个数据库,将这两个数据库中的字段提到TDBGrid中,在TDBGrid修改
两个数据库中字段的值,然后分别返回到各自的库中,该如何实现?
 
当然我不该回答这个问题。因为我的回答是个避开问题的做法
我以前用其他工具解决类似问题是,TDBGrid的一些字段绑定到其中一个表,如果GRID更新,
则绑定表更新。另外后台隐藏一个GRID,然后将另外一些属于第二个表的字段COPY到它上,
然后隐藏控制第二个GRID更新(当然也是帮定到第二个数据库的)
 
不知道你的两个数据表的记录怎么匹配的,如果是自然连接的话,为什么不用主从表
的模式?既方便又直观。
 
这是多表提交的问题。我们的具体做法是在中间层写SQL语句来提交,当然速度比较慢。
具体做法是:
把GRID的数据通过一个OLEVARIANT变量传到中间层,送给一个临时的CLIENTDATASET,然后
根据CLIENTDATASET中的各字段值来提交。
哪位大侠有更好的方法,请指教,小弟也是被此问题缠身,不得已而为之。
但这样确实可行。
 
同意阿朱.
 
我也是用sql语句完成。
 
其实不用,使用CACHEUPDATES和UPDATESQL就可以实现多表更新,实际上简单的很,我对
DELPHI的CACHEUPDATE 和UPDATESQL两样东西仔细研究了一下,发现多表更新实际上和单表
是一回事,其实利用CACHEUPDATES别说多表就算后台没表也能更新,可以随心所欲得创建字段
和表,当然DELPHI的标准控件就足够了!!
 
我也听说用UpdateSQL就可以了,而且是用两个,但具体实现没试过。zhuhuan能否说详细
点。
 
请zhuhuan详细说明.
updateObject只能选一个UpdateSQL,如何更新两个表???
难道在UpdateSQL中同时更新两个表吗?
 
请zhuhuan详细说明.
 
好像不能同时
with query1 do
begin
close;
sql.clear;
sql.add('update table1 set recordname1:=** where ID=1');
ExecSql;
end;
with query1 do
begin
close;
sql.clear;
sql.add('update table2 set recordname2:=*** where ID=*');
execsql;
end;
这样可以吗
 
各位其实在我的回答里应该明白我的意思了,实际上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分似乎。。。 ^_^





 
最簡單的方法是用ADO,可直接實現多表更新
 
多人接受答案了。
 
后退
顶部