B
bsense
Unregistered / Unconfirmed
GUEST, unregistred user!
多表更新<br><br> 如果ADOquery.sql.text ='select a.*,b.type_desc from bspart a left join bstype b on a.type_code=b.type_code'<br><br>即数据集中的数据是从多表获取,保存数据时也会更新到多表去,请问怎样才能只更新本表<br>即只更新bspart,而不更新bstype (不想去手动增加 lookuptype 的字段,太麻烦)<br><br>----------正确----------------<br><br> ADOquery.sql.text ='<br>select a.*,<br>(select top 1 type_desc from bstype where type_code=a.type_code) as type_desc <br>from bspart '<br><br>这样子就不会了. <br> <br>yeskert1 | 2005-5-17 11:40:44 <br> 假如多表关联,只更新其中一个,注意是一个!那么简单的用视图就可以了!当然,建立视<br>图的时候,要让更新表的字段名在视图中不变!这时候,ado能够正确的产生update命令!<br>但是,insert和delete是不行的!所以这没有真正解决问题!<br>如果是SQL2000,那么问题就简单了,为视图写触发器就行了!特别是“M表关联N表更新”<br>时,这是我常用的这个方式!<br>当然,在客户端完全能够解决这类问题,这时需要用TProvider和TClientDataset,比较麻烦! <br> <br>jackierose | 2005-8-8 13:48:20 <br> 唉,还是没有一个治根的方法,我做的平台,用sql语句等特殊的方法去做,那肯定是不行的,看来只能自己写代码,根据要更新内容转换为相应的SQL更新语句来操作数据库好了 <br> <br><br> To zjunlong:<br>关键是怎么设置,Table,Query中都没有相应的设置。 <br> <br>vmao | 2005-5-17 11:17:05 <br> 老早就问过该问题了,要不用BDE,要不用Betterado,要不自己手工处理。<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=1199939<br><br><br><br>我以前发的内部邮件<br><br>发件人: Mike Mao <br>发送时间: 2004年7月5日 9:15<br>收件人: Andy Luo; Betty Xu; Bill Liu; Cloud Yin; George Zhu; Infinite Zhang; Jerry X Gao; Mike Mao; Sea Sun<br>抄送: Benny Cao; Hery Han; David Luo; Joe Song; Gorg Wu<br>主题: ado多表关联,只更新单表的问题。谁能救我?<br><br><br>实际应用:<br>在很多情况下,我们需要在sql中使用多表关联来显示相关信息。<br>如:select d.*,m.itm_name from tblshipmentdt d left join tblitemmaster m on d.itm_code=m.itm_code 出货单明细关联物料表来显示料品名。<br>在选料品代码的时候,我们会把料品名称自动带过来填在TQuery里。<br>问题:<br>在BDE下,我们可以在tquery下挂一个tupdatesql控件,自动生成sql语句来更新单表,这样做一点问题也没有。--无论多少表关联都没有问题,效率高。<br>在.net下,ado.net直接提供了类似BDE Tupdatesql的insert、update、delete三条 sql分开更新。--可能微软已经意识到这样的问题,抛弃了ado在win32下的做法.<br>但在Win32 ADO下,根本没有类似tupdatesql控件,但是微软提供了一个运行期的Unique Table属性来更新单表。可惜的是它只实现了delete操作,对于insert、update到现在还没有实现,似乎还没有继续修改的意思,详细情况见下面的帖~ <br><br>困扰我几年的问题,依然没有答案:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=341750<br><br>本来以为是delphi对ado的封装有问题,可昨天用vb6实现,问题依然是这样,看来是MS对 ADO的处理有问题了。目前ado.net已经解决这样的问题了,MS还会修改Win32下的ADo吗》<br><br>可能有人会提出用Lookup,但是lookup的效率是很慢的,根本不适合做大型系统。<br>可能有人会提出自己写sql更新数据库,然后前台的显示的adoquery重新close,open刷新显示。这样做不但没有效率,而且写起来很烦,如果使用窗体继承的方法更是不可以,因为所有的操作都要在子类实现,父类是没有办法知道子类的具体sql的,这样程序开发就会陷入大规模的重复劳动。<br><br>快疯掉了,有人有更好的建议吗?