procedure TfrmInput.BtnAddClick(Sender: TObject);
begin
  with DMtongtao do
  begin
   ADOCtongtao.BeginTrans;//事务提交
  try
    ADOQrkdj.SQL.Text:='select * from rkdjb where 1=0';
    ADOQrkdj.LockType:=ltBatchOptimistic;
    ADOQrkdj.CursorType:=ctKeyset;
    ADOQrkdj.Open;
   if find=0 then
     begin
      ADOQcpm.SQL.Text:='select * from cpmk where 1=0';
      ADOQcpm.LockType:=ltBatchOptimistic;
      ADOQcpm.CursorType:=ctKeyset;
      ADOQcpm.Open;      ADOQcpm.Append;
      ADOQcpm.FieldByName('P_Code').AsString:=Trim(CmbP_code.text);
      ADOQcpm.FieldByName('P_Name').AsString:=Trim(EdP_name.text);
      ADOQcpm.FieldByName('P_Mode').AsString:=Trim(EdP_mode.text);
      ADOQcpm.FieldByName('P_Dw').AsString:=Trim(EdP_Unit.text);
      ADOQcpm.Post;
     end;    ADOQrkdj.Append;
    ADOQrkdj.FieldByName('rkdh').AsString:=trim(Eddh.text);
    ADOQrkdj.FieldByName('jhname').AsString:=trim(EdJhName.text);
    ADOQrkdj.FieldByName('P_Code').AsString:=trim(CmbP_code.text);
    ADOQrkdj.FieldByName('P_name').AsString:=trim(EdP_name.text);
    ADOQrkdj.FieldByName('P_mode').AsString:=trim(EdP_mode.text);
    ADOQrkdj.FieldByName('P_sl').AsInteger:=strtoint(trim(EdP_SL.text));
    ADOQrkdj.FieldByName('P_price').AsCurrency:=strtocurr(trim(EdP_price.text));
    ADOQrkdj.Post;   ADOQcpm.UpdateBatch;
   ADOQrkdj.UpdateBatch;   ADOCtongtao.CommitTrans;
   showMessage('数据保存成功!');
 except
    ADOCtongtao.RollbackTrans;
    MessageDlg('保存数据失败!',mtError,[mbOK],0);
    Close;
    end;
  end;
end;总说 ADOQcpm:Cannot perform this operation on a closed dataset

解决方案 »

  1.   

    单步调试一下,我怀疑根本没有执行到下列代码内部,ADOCpm没有open,当前后边回出错了,把ADOcpm.UpdateBatch放到AdOcpm.post后边试一下if find=0 then
    begin
    ...
    end
      

  2.   

    用ado存储过程做!比较好!如果是sql库
      

  3.   

    问题已解决
    我把ADOQcpm.UpdateBatch放错地方了应该放在if find=0 then
              begin
             
              end;
    里面,因为find在这里等于1了谢谢各位大虾!!一起努力!