forgot2000 (忘记2000年) :请教 一个问题:好象ado多表联合查询的结果是只读不能修改的呀?你是如何做到的,能说说不?

解决方案 »

  1.   

    可以修改的,我就遇到过,不过我那次是哪个表在前面,就修改(插入)哪个表,正合我意。如:select a.*,b.* from a,b  这时插入数据,就只插入到a表
      

  2.   

    不行的,我试过很多次了,很多朋友在使用ADO的时候也有这个问题,但奇怪的是:有的有这个问题,有的却没有。而我是所有ADO、BDE、Delphi的升级补丁都打上了,还是解决不了这个问题。但最最费解的是,同一个程序中,我用两个ADOQuery都写了相似的多表连接语句,其中一个ADOQuery更新存在问题,另一个却没有,我找了老半天都没发现这两个ADOQuery有什么属性设置不一样,我搞得头都大了。
      

  3.   

    ADO可以同時處理多個表的更新,而且一句代碼都不用寫,但比較容易出現數據更新的錯誤,因為每個表都有自己的保存規則,如某個字段不能為空之類的東西,新增的時候就更煩了。
    修改的時候大慨沒什麼問題,因為數據本來就是合法的(已保存了一定就是合法的啦:))。
    在新增的時候,就很大可能出錯了,因為你可能隻選了一部分的字段出來,DataSet隻會處理這些字段,沒選的字段的合法性難以保障。
    還有它更新第二個表的時候它的處理方法應該是這樣的(以問題的SQL語句為例):
    Update Table1 Set 更改的字段=新值 Where B_ID=對應的B_ID
    Update Table2 Set 更改的字段=新值 Where B_ID=對應的B_ID
    這樣的話,你說有什麼保障呢?
    你可以用Profiler看一下後端做了些什麼!:)
      

  4.   

    TO: forgot2000(忘记2000年) ,每一個版本MDAC都有一點點區別(我這樣認為)。
        用了ADO快一年了,現在基本上沒什麼問題,Borland公司有對MDAC2.6 Bug
    (EOF AND BOF)的解決方法,多點到BORLAND公司的網站看一下吧!主要是使用模式的問題,當你開始做的時候要做好技術測試,要不做之前遇不到的,後面才發現,這就有點晚了!我修改了部分ADO.DB的代碼(DELPHI 5),太長了,不能貼!:( 。
        不同的SQL 都會有一點區別,SQL 7.0和SQL 2000有很大的區別,SQL2000 改進了很多!多點了解ADO的工作流程,你會有很大的收獲。
        補充一點,有些所謂的BUG(不是BUG)是正常的,如在查找字段中找不到對應的值時出現的非終斷型報錯,但DELPHI好象是提示"未知錯誤":(,我把這段東西跳過了,免得煩:)。
      

  5.   

    一般情况,我都用SQL语句对数据库进行各种操作
      

  6.   

    关注帮你up.
    ADO也用了很长时间了,一般在设计编码的时候就应该注意
    多表查询后不可改的问题,及时采用gettext、lookup、计算字段等等
    方法来避免修改的情况。对于你的情况可能要用另adoquery的SQL语句
    直接对数据库操作,然后在重新刷新原adoquery,和定位记录
    另adoquery的SQL可以在原adoquery的beforepost内操作吧。
      

  7.   

    主要问题好像在添加上,你接管BoforePost事件,在里面写insert代码再在另外一个Query中执行,将书签保存,然后将自己cancel掉,close再open,还原书签,然后abort掉,试试。不过我觉得还是使用单个表,用lookup字段吧,如果你认为Lookup字段不能添加新名字,那么你加一个可编辑计算字段,在字段的OnGetText中将Lookup字段的值
    写入,BoforePost时,看看编辑字段的DisplayText是否能loacte name不行的话
    就在b表中添加一条记录。
      

  8.   

    主要问题好像在添加上,你接管BoforePost事件,在里面写insert代码再在另外一个Query中执行,将书签保存,然后将自己cancel掉,close再open,还原书签,然后abort掉,试试。不过我觉得还是使用单个表,用lookup字段吧,如果你认为Lookup字段不能添加新名字,那么你加一个可编辑计算字段,在字段的OnGetText中将Lookup字段的值
    写入,BoforePost时,看看编辑字段的DisplayText是否能loacte name不行的话
    就在b表中添加一条记录。