共两个表:一个为a(字段为:number,age);
            另一个为b(字段:name,number);
想以age为条件在b内查询,并显示在dbgrid1内:
 with CXQ2 do
  begin
        close;
        SQL.clear;
        SQL.Add('select *');
        SQL.Add('from "'+'d:\b.db'+'"');
        SQL.Add(' where number in(select number from "'+'d:\a.db'+'" '+' where age>"'+10+'"'+')');
        open;
  end;
可查出结果问题是:使用语句 SQL.Add(' where number in(select number from "'+'d:\a.db'+'" '+' where age>"'+10+'"'+')');导致dbgrid1总是只读的,我想使它可编辑,上述语句该怎么改???
真的要郁闷死了,急啊
请各位帮忙!!
先深表谢意!!!!!!!!!!!!

解决方案 »

  1.   

    把Query1的两个属性设置为:
    CachedUpdate:TureRequestLive:Ture
      

  2.   

    把dbgrid1的options的dgEditing设为True;
    dbgrid1的Readonly设为False;
    query1的LockType设为ltOptimistic
      

  3.   

    换个新的query1
    换个新的Dbgrid
      

  4.   

    To;liangyong007a(梦里有云,心中有天地)
       
       我已经
       把dbgrid1的options的dgEditing设为True;
       dbgrid1的Readonly设为False。
       不过没找到query的LockType这一属性啊
    结果当然还是只读了,请指点,谢谢了!!
      

  5.   

    To:cdsgajxlp(起名很难) 
       我已经全换过几次了,都一样
    去掉语句:SQL.Add(' where number in(select number from "'+'d:\a.db'+'" '+' where age>"'+10+'"'+')');就可以编辑,一切正常
    而当一加上这条语句就一直是只读了
       多谢帮助!请再帮我想想!
       
       先谢谢大家了!
      

  6.   

    改query的readonly
    dbgrid的readonly
      

  7.   

    把query1换成Adoquery1吧。用Ado方式连吧
      

  8.   

    query 不可写只可以读。改用table 就可以了,或是改用adoquery
      

  9.   

    To:whbo(王红波(在失望的田野上,狂奔ing...)) 
       改过了,一直不行!
       请继续指点
    谢了
      

  10.   

    搂主是用BDE控件的吧,不知道我说得对不对。
    TQuery控件可以编辑除了CachUpdate要设为True外在UpdateObject属性中也要指定一个TUpdateSQL控件用于ApplyUpdate操作。要是UpdateObject属性中没有填写任何TUpdateSQL控件的名称的话Query是不会允许被修改的。
    楼主可以试一试。
      

  11.   

    To:liangyong007a(梦里有云,心中有天地) 
       用AdoQuery和用query时,sql语句差不多吗?只是将语句中query改为adoquery吗?   用table进行复杂查询,不好做啊,就说这个例子吧,该怎么写查询语句呢?
       
      
      

  12.   

    用AdoQuery和用query的SQL语法是一样的,TTable只能打开单一个表,不能使用SQL来查询
      

  13.   

    用AdoQuery和用query时,sql语句差不多.只是将语句中query控件改为adoquery控件。试试吧。
      

  14.   

    To:JetJack(喷气引擎) 
       
       TQuery的CachUpeddates设为True,在UpdateObject属性中指定一个TUpdateSQL控件用于ApplyUpdate操作。
       这样确实可以dbgrid1内容可以编辑了,可是当我修改数据后,不知道该怎么保存,我用语句query1.edit;query1.post;之后,还是保存不了,也就是说我对其数据的修改都无效。假如
    设CachUpeddates设为 False,dbgrid在焦点移动时能自动保存, 可设CachUpeddates设为 False时
    dbgrid又成只读了。
    是不是要给TUpdateSQL的deleteSQL或insertSQL或ModifySQL写动态sql语句啊?
    该怎么写啊?
       请帮忙,谢谢了!!!
      

  15.   

    To:liangyong007a(梦里有云,心中有天地)
       谢谢你!可是我还是郁闷:规定了用db表,没法用Tadoquery了,对吧?
       TTable只能打开一个表的话,那我上面要实现的那种查询功能是没法实现了,对吧?    请再帮我想想!谢谢了!!
      

  16.   

    to 楼主:
    工作忙到现在才有时间答复。你把TUpdateSQL拖拉到窗体后双击控件图标就可以打开生成更新语句的对话框,可以帮你产生插入、更新和删除SQL语句,操作不是很复杂,你可以自己摸索一下,不行再问。产生了更新SQL语句后你要自己为TQuery加入ApplyUpdate方法这样你修改的内容才会保存到物理数据库中。至于中间的过程DELPHI可以帮你完成,一般不用你操心。
    db表也可以用Tquery的,在SQL中使用连接就可以查询几个表的数据。
      

  17.   

    To:JetJack(喷气引擎) 
      谢谢你!我双击TUpdateSQL时提示:Unable to determine field names for CXQ2.
    CXQ2是查询表b.db的Tquery控件,不过还是可出现 生成更新语句的对话框,这样会没问题吗?
    要更新的话需要在对话框内写语句吗,可是具体修改是用户完成的,意思是说应该写语句使:对该
    表的任何修改都可用它,比如要修改dbgrid1显示的对D:\b.db的查询结果,该怎么写呢?请帮忙?
    谢谢了!!等你好消息了
      

  18.   

    to  heart007(我的天空在下雨):
    出现Unable to determine field names for CXQ2.是因为你在打开TUpdateSQL时数据源关联的那个TDatabase控件无法打开所致,至少在我自己的机器上是这样。在TUpdateSQL中你设定需要更新的表和字段就可以,SQL语句由控件自动产生,调用也由系统自动进行,你只须调用ApplyUpdate就可以了。不过要注意的是这个TUpdateSQL只能更新一个表,如果你要更新两个以上的表可能要在OnUpdateRecord事件函数中写自己的更新代码了。对于任何数据感知控件(TDBEdit,TDBGrid等)对数据集的修改数据集只需调用ApplyUpdate就可以了。
    工作太忙,现在才回答不好意思。#:)
      

  19.   

    to:JetJack(喷气引擎) 
       非常感谢!我再试试看!
      

  20.   

    to:JetJack(喷气引擎) :
      怎么设要更新的表及字段啊?我双击TUpdateSQL的modifysql后,在第一行写“name”,第2行写“number”,可调用ApplyUpdate时提示‘token not found.token:name  number’
    怎么解决?谢谢!!
      

  21.   

    TQuery与TADOQuery有很大的差异,TQuery使用复合SQL或order by、group by后基本上就是只读的,N麻烦的!
      

  22.   

    不要在TUpdateSQL内写SQL语句以及使用TQuery的ApplyUpdate,当有多人操错时会发生死锁.
    那个字段发生修改了,直接用另外一个query,使用Update语句写入数据库,当然如果有多条更新,
    加上事务控制,多表更新也可以这样
      

  23.   

    实际上,只要查询语句里涉及到两个表的时候,dbgrid就不能编辑了,因为它不知道该如何更新那两个表,你可以想象当sql语句比较复杂的时候,怎么能知道如何更新表呢?
      

  24.   

    To:JetJack(喷气引擎) 
       对。指定表就可以了(原以为在TUpdateSQL内指定呢:)),不过当表的位置改变之后就不行了
    表的位置不定,这该怎么办?要程序中自己写相关语句吗?
    谢谢!