请教有关ADO和left join的用法,请大家帮个忙!我在ADOQuery1里这样写select A.货品代号 , B.货品名称 , A.数量
from A left join B on (A.货品代号 =B.货品代号)当我在ADOQuery里执行 ADOQuery1->Delete();
时出错或两个表(A,B)里的该行记录都被删除!其实我只想删除A表中的记录!请问有什么解决方法。
我知道可以用一个其它的ADOQuery写一行SQL语句将A表的该行数据删除,但此时ADOQuery1里仍然存在该行数据,会将生误会。我以前用过BDE,里面是用UpdateSQL这个控件更新数据库,可以实现这个功能,而且还可以确定记录的哪些字段更新哪些字段不更新。

解决方案 »

  1.   

    Delete 后 Refresh 一下 ,adoquery 就更新了,就不会产生误会了
      

  2.   

    那么能否当我修改查询记录时,只有A表的修改会被保存,而B表的修改不会被保存。
    因为我是在DBGrid里增加记录,当打了“货品代号”后从数据库里取得“品名”,同时显示在DBGrid里。请问ADO能实现这个吗?
      

  3.   

    >> qixin000(小齐) 
    >>    Delete 后 Refresh 一下 ,adoquery 就更新了,就不会产生误会了当我用另一个ADOQuery写一条删除语句后,再在ADOQuery1->Refresh();
    就产年错误“缺少更新或刷新的键列信息”我的A表与B表均有Key 
      

  4.   

    你可以建立主从表关系,a从表,b主表,你不是要,a->b:n-1的关系吗。从表的删除不影响主表。
      

  5.   

    这个应该不是主从关系的问题,因为我只是想从字典表里取出详细资料显示出来。但为什么老是达不到效果?到底是我不会做还是ADO根本没有这个功能?
      

  6.   

    简单点,再Close——Open就可以了!
      

  7.   

    简单点,再Close——Open就可以了!
    配合DisableControls和EnableControls!
      

  8.   

    这个当然可以,但当你删除一条记录后,如果用close open 数据又会走到数据库的第一条记录。好麻烦的!难道真的没有办法了吗?
      

  9.   

    SQL语句会不会少了个outer啊
    select A.货品代号 , B.货品名称 , A.数量
    from A left outer join B on (A.货品代号 =B.货品代号)试一下。应该可以显示a表的所有行。
    如果想显示A表中具有‘A.货品代号 =B.货品代号’关系的记录就要:
    select A.货品代号 , B.货品名称 , A.数量
    from A inner join B on (A.货品代号 =B.货品代号)想对它操作(如删除)就要另外用Query来实现,因为你不是主从表关系,用它来更新数据库,会对两个表同时更新的,就象你上面说的一样。
      

  10.   

    通过SQL语句删除,否则问题很多!
    因为不同的数据在这方面具体的标准不一样,很难统一判定
    例如你在删除时可以:with ADOQuery.Create(Self) do
    try
      Connection:=YourDM.Connection;
      SQL.ADD('delete from A表 where 货品代号='+QuotedStr('某个货品代号'));
      ExecSQL;
      //然后你的前端显示数据更新,最好是关闭然后打开,否则可能会出现“缺少更新或刷新的键列信息”问题(例如没有主索引等)
    finally
      Close;
      Free;
    end;
      

  11.   

    既然ADO这么麻烦,为什么大家大多不用BDE而用ADO?
    ADO有什么比BDE优胜的地方?
    由于我的项目快要上了,如果用ADO则我的查找与添加、修改必须在不同的界面。要不然在打入编号时又不会出现物品的名称。
    请各位大侠多多指教!
      

  12.   

    你说的问题BDE同样存在!还是你的设计有问题,本来这种东西就是这样,你去看看SQL工业标准就明白了!
      

  13.   

    to Hank(星星农场) ,
        很多谢你的回答!在BDE中可以用UpdateSQL 选择要更新或要增加的项目,只要不更新 left join 其它表的项目就行了。对于SQL工业标准我真的不太清楚,我只会用一部份。
    那么在软件设计中是不是大家都将查询/输入/修改放在不同的界面上?
      

  14.   

    在ADOQuery列中新增加一列,输入Name type size 的值,在feeld type 中选择loouup 在DATASET中选择要显示数据的表,在Result field 选择要显示的列,在 keyfields 和lookup keys 选择两表的外键 点击ok.
      

  15.   

    对啊,我就是这样做,不过速度真的比left join慢了很多,时间大约是left join 的几倍。请问你在做这样的表时用的是哪样方法?是将输入与查询分开不同界面还是怎样?
      

  16.   

    你可以試一下,把數據顯示在TStringGrid 里.  
      

  17.   

    请问在DBGrid里可不可以建一列,这列不与数据库相连,用以在程序里显示某个ID的名称。
    我想做到的效果是:在用户输入时DBGrid里列分为可输入列(通常为物品的ID)和不可输入列(物品的名称),当输入ID后名称就会查找出来并显示于DBGrid的某列中.
    我看过金碟就是这种用效果,但具体怎样做就不清楚。我现在查询与输入是同一个界面,查询时用left join,但如果在这时对数据库进行insert操作,就会提示我的物品资料里不能增加ID 为 null的字段。(因为我在物品资料里设定了Key)up 一下!