为什么在下面的事件中,有时会出现“无法更新;当前被锁定”的信息,有时又正常的呢?   if DBGrid1.SelectedRows.Count <= 0 then
      Exit;   Self.Enabled:=false;  
   DBGrid1.DataSource.DataSet.DisableControls;
   try
      for i:=0 to DBGrid1.SelectedRows.Count-1 do
      begin
          DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i]));
          if IsMobile(Trim(DBGrid1.DataSource.DataSet.FieldByName('手机').AsString)) then
          begin
              Application.ProcessMessages;
              MainForm.N28.Click; //调用某事件,此事件会返回SendStatus
              if SendStatus=0 then   
                 TrueFalse:='true'
              else
                 TrueFalse:='false';              ADOQuery7.Close;   //将上面的结果插入表中
              ADOQuery7.SQL.Clear;
              ADOQuery7.SQL.Add('insert into 生日表(编号,姓名,手机,生日时间,厂家,型号,车牌号码,发送时间,类型,状态) values('
                   +ADOQuery2.FieldByName('编号').AsString+','
                   +#39+ADOQuery2.FieldByName('姓名').AsString+#39+','
                   +#39+ADOQuery2.FieldByName('手机').AsString+#39+','
                   +#39+ADOQuery2.FieldByName('生日时间').AsString+#39+','
                   +#39+ADOQuery2.FieldByName('厂家').AsString+#39+','
                   +#39+ADOQuery2.FieldByName('型号').AsString+#39+','                   
                   +#39+ADOQuery2.FieldByName('车牌号码').AsString+#39+','
                   +#39+DateTimeToStr(Now)+#39+','
                   +#39+'新历'+#39+','+TrueFalse+')');
                 ADOQuery7.ExecSQL;
              ADOQuery2.Delete;  // 此DBGrid1 所对应的DataSet
          end;
      end;
      DBGrid1.DataSource.DataSet.EnableControls;
      Self.Enabled:=true;
      Edit2.SetFocus;
      DBGrid1.SetFocus;
   except
      on E: Exception do
      begin
         DBGrid1.DataSource.DataSet.EnableControls;
         Self.Enabled:=true;
         Edit2.SetFocus;
         DBGrid1.SetFocus;
         MessageBox(Handle,PChar(E.Message),'提示',MB_ICONWARNING);
         Exit;
      end;
   end;
   DBGrid1.DataSource.DataSet.EnableControls;
   Self.Enabled:=true;
   Edit2.SetFocus;
   DBGrid1.SetFocus;

解决方案 »

  1.   

    从代码中没有发现你的dbgrid的datasource与adoquery的datasource是否指向同一张数据表
    如果是的话,出现这样的错误提示,多数是因为更新的冲突
    即对当前记录进行操作的同时又企图更新之
      

  2.   

    To  cobi(我是小新)  :上面的dbgrid的datasource与adoquery2的datasource是指向同一张表的,
    为什么有时可以正常,有时会出现更新冲空,如何解决呢?
      

  3.   

    我本来意味adoquery7和dbgrid指向同一张表,原来还有个adoquery2
     首先,从循环的角度看,如果在循环中要删除循环体内的记录,那么
     for i:=0 to DBGrid1.SelectedRows.Count-1 do
     就应该修改为:for i:=DBGrid1.SelectedRows.Count-1 downto 0 do
     这样才能保证所有的记录被遍历到 其次,DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i])); 你往那里设置了book啊,而且也没有看见你释放book,我怀疑这个更新错误的信息不是你更新到生日表,而是删除记录时的问题,你最好单步执行一下,看是什么样的记录会出这个错
      

  4.   

    To  cobi(我是小新) :
    不错,上面的出错是由于删除记录时的问题,但是奇怪同一批记录,有时正常,有时会出错,出错信息如上面所述“无法更新;当前被锁定”
    大家有何解决的办法呀?
      

  5.   

    To  hnhb(不死鸟):
     如何放在一个事务中处理呀,事务好象对执行这些SQL语句是没有作用的呀'insert into 生日表……’
      

  6.   

    就我个人的看法,其实没有必要在循环中用gotobookbark这个方法
    因为是可以直接去取得dbgrid当前选中记录中的任意一个字段值的
    至于为什么同一批记录有的可以,有的不行,我觉得还是比较一下记录的差别会比较好,也许能从中发现原因
      

  7.   

    To   cobi(我是小新)  :就我个人的看法,其实没有必要在循环中用gotobookbark这个方法
    因为是可以直接去取得dbgrid当前选中记录中的任意一个字段值的——》取得当前选中记录中的任意一个字段值??
    能够实现我上面想实现的功能吗?
    能提供部分源代码吗?
    在此谢过。
      

  8.   

    我不清楚你的ADOQUERY2和ADOQUERY7是否是对同一张表进行操作?如果是的话可能会出现这种问题。所以试着把ADOQUERY2的值在外面先赋在变量里,可能会解决这个问题。