如上了

解决方案 »

  1.   

    有个requestlive设置成false,TRY TRY
      

  2.   

    在EXECSQL前加上一举
    Query.RequestLive:=True;
      

  3.   

    大哥,还没有解决问题呀,还是提示dataset not in edit or insrt mode
      

  4.   

    如果你是使用Query.Delete方法来删除记录的话,Query要处于编辑状态
    可以在Query.Delete前加上
     if NOT Query.CanModify then
     Query.Edit;
      

  5.   

    procedure Tperson.N3Click(Sender: TObject);
    var
      departdel,content:string;
      query1:tquery;
      //TEMPtable:ttable;
    begin
      departdel:=person.TreeView1.Selected.Text;
      content:='确认删除:'+departdel;
      if Application.MessageBox(pchar(content),'提示',mb_okcancel or mb_iconinformation)=mrok then
         try
           try
             xldm.DB_XL.StartTransaction;
             
             query1:=tquery.Create(self);
             query1.Databasename:='DBXL';
             //query1.Database.ReadOnly:=false;
             query1.Close;  //delete the department
             query1.SQL.Clear;
             query1.SQL.Add('delete from department where id=:departID');
             query1.ParamByName('departID').AsString:=pstring(person.TreeView1.Selected.Data)^;
             //query1.Prepare;
             query1.RequestLive:=true;         query1.ExecSQL;
              
             //query1.Edit;
             query1.Post;         query1.Close; //delete the relation person
             query1.SQL.Clear;
             query1.SQL.Add('delete from person where id=:departID');
             query1.ParamByName('departID').AsString:=pstring(person.TreeView1.Selected.Data)^;
             //query1.Prepare;
             query1.RequestLive:=true;
             query1.ExecSQL;
             query1.post;
             xldm.DB_XL.Commit;         treeview1.Items.Delete(treeview1.Selected);
             table1.close;
             table1.open;
             table2.close;
             table2.Open;
           finally
             query1.Free;
           end;     except
           xldm.DB_XL.Rollback;     end;end;
      

  6.   

    把上面的Query1.Post都去掉试一下,如果必须要刷新,可以用下面的代替:
    Query1.Close;
    Query1.Open;
      

  7.   

    到post便提示说dataset not in edit or insert mode;;;;;;;;;;
      

  8.   

    我觉得能行,可是这种修改是直接对数据库操作的呢,还是需要用POST将缓存中的数据写入库中,不过我也写过不用提交也可以库中数据的代码,
      

  9.   

    Post是不需要的,直接执行了EXECSQL后就会把数据库的内容删除掉的下面是TDataSet.Post的源代码:
    procedure TDataSet.Post;
    begin
      UpdateRecord;
      case State of
        dsEdit, dsInsert:
          begin
            DataEvent(deCheckBrowseMode, 0);
            CheckRequiredFields;
            DoBeforePost;
            CheckOperation(InternalPost, FOnPostError);
            FreeFieldBuffers;
            SetState(dsBrowse);
            Resync([]);
            DoAfterPost;
          end;
      end;
    end;
    而UpdateRecord的代码如下:
    procedure TDataSet.UpdateRecord;
    begin
      if not (State in dsEditModes) then DatabaseError(SNotEditing, Self);
      DataEvent(deUpdateRecord, 0);
    end;
    其中 dsEditModes = [dsEdit, dsInsert, dsSetKey];
    所以当Query1的State不在dsEdit,dsInsert和dsSetKey时会调用
    DatabaseError(SNotEditing, Self);这一句SNotEditing在DbConsts.pas单元定义如下:SNotEditing = 'Dataset not in edit or insert mode';
    也就是你所碰到的“数据集状态不可编辑”的错误
    这样的解释满意了吗?
      

  10.   

    根据上面的代码可以看到当执行了EXECSQL后,如果Query不处于编辑状态,是不需要Post的,否则会出现错误提示,只有当Query处于编辑状态,如使用了如下的语句删除记录:
      if Query.State<>dsEdit then
      Query.Edit
      Query.Delete
      后才需要使用Query.Post;
      在执行Query.Delete语句前,必须保证Query处于编辑状态,否则也会出错。