........
........
main.ADOCommand1.CommandText :='update sell set lx=0';
main.ADOCommand1.Execute;
main.ADOQuery1.Close;
main.ADOQuery1.SQL.Clear;
main.adoquery1.SQL.Add('select * from sell where lx<>0');
main.ADOQuery1.Prepared := True;
main.ADOQuery1.Open;
i:=main.ADOQuery1.RecordCount;
      为何i<>0,即我先用一条语句更新数据库,紧接着查询数据库,为何查出来的数据是没有执行更新语句以前的数据库呢?我用的是Delphi6.0+Access,怎样才能使执行完命令后数据库马上更新?

解决方案 »

  1.   

    我经常用Delphi+Access,首先,我认为前体是,如果保证没有动过AdoDataset(包括TAdoTable等)的默认属性的话,上述的问题是不会产生的,至少不会出现第二次查询的返回结果不变的情况。这里产生该问题的原因有:
    1、设置了数据集的什么属性,特别适合客户端缓存有关的属性、或者是立即提交等方面的属性,以导致第二次的返回记过没有更新。
    2、数据集已经更新,但RecordCount没有更新,因为,在底层,Delphi就是封装了微软的Ado组件,不知道,朋友们是没有试过,如果在VB中使用ADO时,如果,不把CursorLocation属性改为"Client"的方式的话,就会导致RecordCount的不准确甚至是不允许访问。所以,这个例子中,也并不排除,返回的结果集正确,但是RecordCount的不正确。建议的调试方法:
        首先,设置断点,监视main.ADOQuery1,看是否是前述第一种情况,如果是,就着重查找main.ADOQuery1的相应属性设置,如果返回的记录集是正确的,就再检查一下CursorLocation属性,总之,如果不是SQL语句方面考虑的欠缺的话,就肯定是数据集的属性有不妥的地方。
       
      

  2.   

    main.ADOCommand1.Execute有
    不用post
    我记得在oracle中有个commit命令的
      

  3.   

    main.ADOQuery1.Prepared := True;这一句没有用,因为这是在用于预设存储过程的属性;
    应该设为false;