[转贴]多表更新,不知道行不行,请大家测试下 ( 积分: 50 )

  • 主题发起人 主题发起人 bsense
  • 开始时间 开始时间
B

bsense

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

Similar threads

后退
顶部