大家知道,用adoquery关联多个表时,更新数据时会出现问题,我现在处理的方式,只用adoquery打开要更新的表,而需要关联到别的字段时,则是新增一个Calculated字段。然后在OnCalcFields事件中写
qryFindData.close;
qryFindData.sql.clear;
qryFindData.sql.add('select name from tablename where number='''+adoquery.fieldbyname('Number').asstring+'''');
qryFindData.open;
adoquery.fieldbyname('Name').asstring:=qryFindData.fields[0].asstring;当然,通过这种方式可以满足需要,但是碰到数据量大的进修,系统打开的时候速度非常慢,我想请问大家,有没有更好的方式处理如上问题。

解决方案 »

  1.   

    使用TDataSetProvider和ClientDataSet可以解决的.
    TDataSetProvider可以指控那些字段可以更新到数据库中.
      

  2.   

    这种情况一般不要使用Calculated字段, 使用连接:select a.f1, a.f2, ...,a.Number, b.name from adoQuery1 as a 
    left join qryFind as b ON a.Number=b.Number  
      

  3.   

    >>用adoquery关联多个表时
    正常是自己写SQL集中提交, 
    如 你的方式 ,确实效率很底
      

  4.   

    是的,目前速度是非常的慢,这样写不太合理,我也是这么认为的。但是不在OnCalcFields写的话,又些功能又实现不了,比如,选择了客户编号,马上显示客户名称。要是不使用这些方法达不到需求。
      

  5.   

    你的问题是数据量大导致查询慢,那么是不是可以用空间来换时间?比如事先先把所有需要的字段通过关联查询放到一个数据集中,更新Calculated字段时就在那个数据集中查找就行了,不需要再查数据库
      

  6.   

    >>楼上的,这种方式我考虑过了,再是处理完了数据以后,马上就要进行数据刷新,那么又要进>>行刷新数据集,这样速度更慢。怎么会呢?
    你处理完了数据之后无非就是运行以两句来刷新一下:
    Adquery1.Active:=false;
    Adquery1.Active:=true;
      

  7.   

    用CLIENTDATASET + ADOQUERY, 使用OURLIN的方式用SQL :
    select a.f1, a.f2, ...,a.Number, b.name from adoQuery1 as a 
    left join qryFind as b ON a.Number=b.Number  然后在TDATAPROVIDER里自己写一个SQL语句指定更新的内容或者字段.计算字段,增加一个就会在OPEN时,多执行一次数据库的计算,如果是来自其他的就是和LOOKUP差不多的情况下,就要增加一个SELECT的过程了,所以慢