现在sql里有book的表,里面有
id      书名         价格
id     bookname    price
1      社会与科学      18
2      delphi入门     25
3      百科            30在delphi里现在希望先把数据保存到dbgrid中,然后点“批量插入”时,把刚才所有存到dbgrid的数据插入到sql可,问一下大家怎么才能做到,有二个关键代码1.button1:“插入到dbgrid中”的关键代码
2.button2:"批量插入到数据库中"的关键代码谢谢大家!

解决方案 »

  1.   

    如果利用dbgrid其实就是利用数据集来操作 
    从excel读数据,然后利用 
    adoquery.append; 
    adoquery.fieldbyname('').value   :=   读的值 
    .... 
    ... 然后,对dbgrid进行编辑. 
    最后adoquery.post;就达到了批量提交了. 
    但这里要用事务来控制. 读Excel代码:利用一个结构体,供你参考 var 
        RangeMatrix:   Variant; 
        OpenDialog1:   TOpenDialog; 
        iRE:   integer; 
        IN_TYPE,vStockName:   String; 
        sStockName,sCompany:   String; 
        i:   Integer; 
        MsExcel,   MsExcelWorkBook,   MsExcelWorkSheet:   Variant; 
        ASN2_NEW:   PASN2_NEW; 
    begin 
        OpenDialog1:=TOpenDialog.Create(nil); 
        try 
            OpenDialog1.FileName:='*.csv;*.xls'; 
            if   not   OpenDialog1.Execute   then 
            begin 
                Result   :=   false; 
                exit; 
            end; 
            MsExcel   :=   CreateOleObject('Excel.Application'); 
            MsExcelWorkBook   :=   msExcel.Workbooks.Open(OpenDialog1.FileName); 
            MsExcelWorkSheet   :=   msExcel.Worksheets.Item[1]; 
        except 
            Result   :=   false; 
        end; 
        //开始从EXCEL文件读取相关的信息     try 
            Application.ProcessMessages; 
              for   i   :=   1   to   MsExcelWorkSheet.Rows.Count   do 
            begin 
                New(FASN2); 
                FASN2.In_Stock_No   :=   trim(MsExcelWorkSheet.Range['B1'].Value); 
                FASN2.MAIN_FLG   :=   trim(MsExcelWorkSheet.Range['A'   +   IntToStr(i)].Value); 
                FAsn2List.Add(FASN2); 
                //在这里可以调用adoquery.append代码 
            end; 
            Result   :=   true; 
        finally 
            MsExcel.WorkBooks.Close; 
        end; 
        MsExcel.Quit; 
        OpenDialog1.Free; 
    end;
      

  2.   

    直接dbgrid。count 循环插入不就可以了吗
      

  3.   

    1.button1:“插入到dbgrid中”的关键代码 
    -----------
    既然数据库中有表book,那只要增加 adoquery,datasource,dbgrid这几个控件,并设置好它们的属性就
    可以了.2.button2:"批量插入到数据库中"的关键代码 --------------var
      v_str:string;  
    begin
      v_str:='insert into t select * from book';
      with adoquery1 do
        begin
          close;
          sql.clear;
          sql.add(v_str);
          execsql;
          if rowsaffected >0 then
            showmessage('插入成功!')
          else
            showmessage('插入失败!');
        end;
    end;
      

  4.   

    也就是先把数据保存到dbgrid中,再由dbgrid的把数据一次插入到sql中,问一下大家怎么才能做到,有二个关键代码 1.button1:“插入到dbgrid中”的关键代码 
    2.button2:"批量插入到数据库中"的关键代码 谢谢大家! 
      

  5.   

    第一个问题最简单:with DBGrid1.DataSource.DataSet do
    begin
      //以下为范例,没有处理数据输入错误检查的问题
      Append;
      FieldByName('ID').Value := Edit1.Text;
      FieldByName('BookName').Value := Edit2.Text;
      FieldByName('Price').Value := Edit3.Text;
      Post;
    end第二个问题应该是涉及前台数据集问题,我猜你的意思应该是先在DBGrid1中存放N条记录,但不要即时存入数据库中,如果是此原因,你不应该使用TADOQuery组件,而应该使用TClientDataSet -> TDataSource -> TDBGrid,关于TClientDataSet的使用方法,你可以用"ClientDataSet1.CreateDataSet"作为关键上网学习一下用法,至于Button2Click中的代码,范例如下:
    procedure TForm1.BitBtn2Click(Sender: TObject);
    var
      cds: TADOQuery;
    begin
      cds := TADOQuery.Create(nil);
      try
        cds.Connection := Self.ADOConnection1;
        cds.SQL.Text := 'Select * From TABLENAME Where ID=0';
        cds.Open;
        with ClientDataSet1 do
        begin
          First;
          while not Eof do
          begin
            //此处范例没有考虑用户输入重复ID的问题
            cds.Append;
            cds.FieldByName('ID').Value := FieldByName('ID').Value;
            cds.FieldByName('BookName').Value := FieldByName('BookName').Value;
            cds.FieldByName('Price').Value := FieldByName('Price').Value;
            cds.Post;
            Next;
          end;
        end;
      finally
        FreeAndNil(cds);
      end;
    end.或许其它看客有更好的做法,欢迎分享。
      

  6.   


    //excel 读到 dbgridvar
      str:string;
    begin
      str:='select * from opendatasource(''microsoft.jet.oledb.4.0'',''data source="文件路径";user id=admin;password=;extened properties=excel 5.0'')...[sheet1$]';
      adoquery.close;
      adoquery.sql.clear;
      adoquery.sql.add(str);
      adoquery.active:=true;
      adoquery.open;
    end;//dbgrid 导入数据表var
      str:string;
    begin
      str:='select *  into t from opendatasource(''microsoft.jet.oledb.4.0'',''data source="文件路径";user id=admin;password=;extened properties=excel 5.0'')...[sheet1$]';
      with adoquery do
        begin
          close;
          sql.clear;
          sql.add(str);
          execsql;
          if rowsaffected>0 then
            showmessage('插入成功')
          else
            showmessage(插入失败);
        end;
       
    end;
      

  7.   

    我觉得用TClientDataSet 最为简单:
    首先我们把各个连接做好,TADOConnection连接数据库,TADOQuery连接TADOConnection,TDataSetProvider连接TADOQuery,TClientDataSet连接TDataSetProvider,TDataSource连接TClientDataSet,TDBGrid连接TDataSource,然后,我们用TADOQuery查出数据,TDBGrid会自己显示数据:
    button1:
    with ClientDataSet1 do 
    begin 
      //以下为范例,没有处理数据输入错误检查的问题 
      Append; 
      FieldByName('ID').Value := Edit1.Text; 
      FieldByName('BookName').Value := Edit2.Text; 
      FieldByName('Price').Value := Edit3.Text; 
      Post; 
    end;
    button2:
    if ClientDataSet1 .State in [dsinsert,dsedit] then
      ClientDataSet1 .Post;
    if (ClientDataSet1 .ChangeCount > 0) then
    begin
      if CDS_ClientDataSet1 .ApplyUpdates(-1)>0 then
         begin
            showmessage('保存失败,请检查是否有重复数据!!!');
            exit;
         end
         else
         begin
            showmessage('保存成功!!');
         end;
    end;
      

  8.   

    致:heiyuyun 
      非常感谢你的回帖,我使用您给我的代码时,提示:clentdataset1:cannot perform this operation on a closed dataset.
    能不能把你的源程序发给我,[email protected]
    不胜感激!
      

  9.   

    用adoquery的批量处理就行了啊
      

  10.   

    这个问题已解决了,现在散分给大家,我的另一个类似的问题在:(有130分)http://topic.csdn.net/u/20080229/21/e52b835f-4a1c-4236-9240-87fb956bf9fd.html
    请大家再帮忙看看,分一定送上。