做了一个按钮,代码如下
procedure TLogin.Button1Click(Sender: TObject);
begin
  ADOTable1.Open;
  if ADOTable1.Locate('code;disable;delete',VarArrayOf([edit1.Text,false,false]),
    [loCaseInsensitive]) then
    showmessage('yeah') else showmessage('oh no');
  ADOTable1.Close;  
end;在edit1输入东西,然后在table中定位记录,开始的时候有一条记录可以定位,按下按钮会显示yeah。
用access 2000打开数据库,将这条记录修改,关闭access 2000 ,由于数据库已经改变了,按理说再按这个按钮应该显示oh no。不过情况是,我按下去,头3次依然显示yeah,到第三次才显示oh no。这个问题我曾经在TADOQuery控件也发现过,一年前搞得我很烦,问题还是未解决。调用refresh方法10次也是一样,只要过几秒钟,数据就可以刷新。感觉就是access反应很慢那样,以前用一个TADOQuery组件先查询了些记录,然后关闭这个dataset,将这个查询改成删除记录的语句,调用execsql执行删除指令,原本以为还是用这个控件查询一次,之前的记录一定不见了,谁知情况很不确定,有时迅速看到记录不见了,但是有时查询3-5次还看到本应该删掉的记录。而且修改,增加都有相同的情况,总觉得不应该是这样的。我是用jet 4连接access数据库的。有谁能帮助我吗?

解决方案 »

  1.   

    那是你的数据集控件ADOTable1已把Access数据库中的数据取到前端来了
      

  2.   

    楼上说的对,但在OPEN之前,先CLOSE一下有时候也不行
    最好把ADOConnection也断开,在连接,然后在ADOTable1.open,这样看看还存在以上问题吗?
      

  3.   

    如果按钮没有按下,table的状态是close的阿!所以不需要在open之前先close,close是我按钮最后一句做的。我没有使用ADOConnection组件,直接将table连接到数据库。问题依然没有解决。
      

  4.   

    应该要close一下,你已经open了,试一下就知道了
      

  5.   

    与数据库有关的操作,在open之前都应该先做一个close,否则很容易出错的
      

  6.   

    我曾经试过在完成一个更改(如删除)后,连续close,open 一个query 3-4次,但是问题依旧,被删除的记录依然被找出来,但是过3-4秒后,在开关一次,就找不到了。如果说access不能迅速处理更新,也不妥,怎么用office 的access时没发现这种情况?怎么分析都不应该出现这种情况啊!
      

  7.   

    在ACCESS中的删除是软删除,而且你没有把修改的结果UPDATE到数据库,如果你UPDATE到数据库后,再将ADODATASET关闭,打开,我想问题就能解决了。顶一下
      

  8.   

    回Bear_King(今夜无人入睡),我一般对数据库操作,都是通过将sql语句写入sql.text中,然后通过execsql来执行的。问题回到最上面的帖子,我可是用office access打开access数据库来修改记录的,当关闭office access之后,我没有找到记录不改变的理由。
      

  9.   

    我的程序是这样的,在输入用户名c,若code字段等于输入的,并且disable或delete是false的时候,定位。如果成功,输出yeah,如果不成,输出oh no。我放在这里,大家看看
    http://webmail.21cn.net:8082/fcgi/file/可怜的程序.rar?action=download&filename=/1097724741如果程序运行后输出yeah,用access打开数据库,将该记录的disable或delete随便一个更改成true,迅速关闭access,再点“登陆”几下,可能发现前几次显示yeah,而后面显示oh no。为何?而且如果不用access修改,而是在程序中发sql语句修改,情况会一样。
      

  10.   

    遇到过你的问题
    语句执行完以后再 close 再 open 就可以了
      

  11.   

    procedure TLogin.Button1Click(Sender: TObject);
    begin
      ADOTable1.Close;
      ADOTable1.Open;
      ADOTable1.Refresh;
      if ADOTable1.Locate('code;disable;delete',VarArrayOf([edit1.Text,false,false]),
        [loCaseInsensitive]) then
        showmessage('yeah') else showmessage('oh no');
      ADOTable1.Close;  
    end;