在多层分布式架构中,当datasetprovider.resolvetodataset=true时候,这时候使用ado方式更新数据。  
 
当我更新的是另外一个数据库视图的时候,通过ado方式产生的sql语句是错误的。  
比如现在有两个数据库PPODB,pubs。现在通过一个账号ppo(默认登陆到ppodb数据)更新pubs..titleview这个视图时候,结ado可以正确分解出表名称,但是数据库名竟然被替换成ppodb,这显然是错误的。  当然如果更新的是一个表的话,比如pubs..titles时候,ado可以正确产生update语句。  
 
 
更新时候提供的sql数据来源指定视图:  
select  *  from  [PUBS].DBO.[titleView]  
   
结果ADO产生的更新sql语句,数据库换成ppodb了:  
go  
exec  sp_executesql  N'UPDATE  "PPODB".."titles"  SET  "title"=@P1  WHERE  "title"=@P2  AND  "title_id"=@P3',  N'@P1  varchar(3),@P2  varchar(3),@P3  varchar(6)',  'xxx',  'aaa',  'BU1032'  
 
 
为什么会这样?  

解决方案 »

  1.   

    跟踪一下VCL源码,一步步的,你自己都可以分析想办法解决的。
    尽管解决这样的问题不会太容易。
      

  2.   

    我也不想钻进去了,肯定是分析sql语句时候产生的bug 。但是这个错误应该是ADO产生的。
      

  3.   

    这个应该不是Borland的问题,因该是ADO本身的问题。你尝试更新一下ADO驱动看看
      

  4.   

    哈哈,
    看来估计只有borland公司自己才能替数据库厂商解决了这个问题了
      

  5.   

    替换成 mdac 2.8 还是一样。delphi6是不是默认就用ado2.1,所以升级ado版本无效?Delphi ADO-based applications use Microsoft ActiveX Data Objects (ADO) 2.1 to interact with an OLE DB provider that connects to a data store and accesses its data
      

  6.   

    找到一个比较笨的解决办法,在执行DatasetProvider.ApplyUpdate之前,动态修改Connection 的DefaultDatabase属性值。