我的目的是要实现在DBGRID里把多选的行插入到另一个表里,大家该怎么做?
我这样做代码错在哪里?为什么在提交时总是提示数据集没有打开?(cannot perform this operation on a closed dataset)
////这是选中事件的代码
procedure TProdIdentForm.DBGrid1CellClick(Column: TColumn);
var
  I: Integer;
  vBook: string;
begin
  DBGrid1.DataSource.DataSet.DisableControls;
  vBook := DBGrid1.DataSource.DataSet.Book;
  try
    for I := 0 to DBGrid1.SelectedRows.Count - 1 do
    begin
      DBGrid1.DataSource.DataSet.Book := DBGrid1.SelectedRows[I];
      with DataM.MutiSelectADOQ do
      begin
        close;
        sql.Clear;
        sql.Add('insert into item_master ');
        sql.Add('select * from prod_master where prod_code=:code ');
        parameters.ParamValues['code']:=''''+DBGrid1.DataSource.DataSet.fieldByName('prod_code').AsString+'''';
        DataM.MutiSelectADOQ.ExecSQL;
      end ;
    end;
  finally
    DBGrid1.DataSource.DataSet.Book := vBook;
    DBGrid1.DataSource.DataSet.EnableControls;
  end;end;
/////这是提交代码
procedure TProdIdentForm.BitBtn3Click(Sender: TObject);
begin
  DataM.ADOConnect.BeginTrans;
  try    DataM.MutiSelectADOQ.UpdateBatch;
    showmessage('OK!');
    DataM.ADOConnect.CommitTrans;
  except
    DataM.ADOConnect.RollbackTrans;
    showmessage('Error!');
  end;
end;

解决方案 »

  1.   

    procedure Tform.button1Click(sender: TObject);
    var i: integer;
        strsql: string;
    begin
      for i:=0 to DBGrid1.SelectedRows.count-1 do
        begin
          DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i]));
          
          strsql :='insert to table1(v1) values('+DBGrid1.DataSource.DataSet.Fields[0].AsString+')';
          adoconnection1.execute(strsql);
        end;//...end for
    end;
      

  2.   

    在UpdateBatch之前先调用edit方法试试,提示错误是说你的数据集已经关闭
      

  3.   

    楼上,我使用的INSERT语句啊,不能用EDIT的方法,只能用EXECSQL啊
      

  4.   

    IwantFlay(小飞) :
      可我要的是在DBGRID的里多选的啊,你的方法只能提交一条啊,不能提交我所选的啊
      

  5.   

    接楼上:for i:=0 to DBGrid1.SelectedRows.count-1 提交的应该是多行,你自己找找错在那里
      

  6.   

    问题已经解决!!DBGRID里不用写代码,选择完直接提交,感谢smilefox2000(很想拜师) 、 IwantFlay(小飞)。下面是提交代码:procedure TProdIdentForm.BitBtn3Click(Sender: TObject);
    var
      I: Integer;
      strsql: string;
    begin
      DataM.ADOConnect.begintrans;
      for i:=0 to DBGrid1.SelectedRows.count-1 do
      begin
        DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i]));
        with DataM.MutiSelectADOQ do
        begin
          sql.Clear;
          sql.Text:='insert into prod_master select * from item_master where item_code='''+DBGrid1.DataSource.DataSet.fieldByName('item_code').AsString+''' and IsProdut=''0''';
        //DataM.ADOConnect.execute(strsql);
          execsql;
        end;
      end;
      try
        DataM.ADOConnect.CommitTrans;
        with DataM.PubADOQ do
        begin
          sql.Clear;
          sql.Text:='update prod_master set IsProdut=''1''';
          execsql;
        end;
        application.MessageBox('更新成功!','系统提示',48);
      except
        DataM.ADOConnect.RollbackTrans;
        application.MessageBox('更新失败!','系统提示',16);
      end;
    end;