我把查询得到的结果显示在DBGRID中,然后在修改了其中的几个字段后把所有DBGRID中显示的所有数据(不管有没有修改)插入同一数据库,该怎么实现?
用FOR语句根据RECORDCOUNT吗?

解决方案 »

  1.   

    没有必要,POST 一下,会自动替你处理的!
      

  2.   

    post 一下就可以(如果不使用批处理的话)
      

  3.   

    好像DBGRID.dataset.post
    或者DBGRID.dataset.Update之类的,自己找找哦
      

  4.   

    如果你没有使用批处理你改的同时就在数据库中更改掉了,  如果使用了批处理就要使用dataset.commit了
      

  5.   

    POST是什么意思?
    可能是我没有说清楚,我的意思是在原来的基础上再增加那么多记录,不是修改原来的记录。
    比如原来数据库中有100条,我查了30条,在改动后我要保持原来的100条不变的情况下怎么再加30条修改的?
      

  6.   

    那不能够这样来实现,  在DBGRID 中修改了要么全部提交了要么都不提交,  你还是另想办法吧
      

  7.   

    只能这样了哦.把你修改过后的内容(千万不要提交)放到一个数组里面去,然后把数组里面的内容INSERT入表里面
      

  8.   

    用2个adoquery,adoquery1连表格查询你所需要的30条记录,把它的locktype设置为ltBatchOptimistic,这样你修改表格以后就不会自动提交了,然后用adoquery2 select所有的100条记录,然后append,
    用adoquery2.fieldbyname('xx').value:=adoquery2.fieldbyname('xx').value
    这样一条一条添加记录就可以了
    最后再adoquery2.post
    就ok了
      

  9.   

    to: maycy(maycy)
      能告诉我怎么实现吗?具体谈一下,我比较菜啊
      

  10.   

    to wizardqi(男巫):
       使用ADO连接ACCESSto drift1981(drift1981):
       那如果我有1000条记录,速度会不会很慢?
      

  11.   

    //如果你使用的是ADO可以使用如下过程。
    procedure DoubleAll(DBGrid:TDBGrid);
    var
         DS1,DS2:TADODataSet;
         i:Integer;
    begin
         DS1:=TADODataSet(DBGrid.DataSource.DataSet);
         DS2:=TADODataSet.Create(nil);
         DS2.Clone(DS1);
         DS2.First;
         with DS1 do
         begin
              while not DS2.Eof do
              begin
                   Append;
                   for i:=0 to Fields.Count-1 do
                   begin
                        Fields[i].Value:=DS2.Fields[i].Value;
                   end;
                   Post;
                   DS2.Next;
              end;
         end;
         DS2.Free;
    end;
      

  12.   

    那如果我有1000条记录,速度会不会很慢?adoquery2可以sql.add('select * from table where id =-1')返回一个空记录然后再append
      

  13.   

    to wizardqi(男巫) :
       那我怎么更改其中的一项呢?比如我有个月份的字段,复制前是2004-07,复制后其他都不变,就把月份改为2004-08,能实现吗?
      

  14.   

    //改成这样
    procedure DoubleAll(DBGrid:TDBGrid);
    var
         DS1,DS2:TADODataSet;
         i:Integer;
    begin
         DS1:=TADODataSet(DBGrid.DataSource.DataSet);
         DS2:=TADODataSet.Create(DBGrid.Owner);
         DS2.Clone(DS1);
         //定位要改的记录比如:DS2.Locate('key','666'); 
         DS2.FieldByName('月份').AsString:='2004-08';
         DS2.First;
         with DS1 do
         begin
              while not DS2.Eof do
              begin
                   Append;
                   for i:=0 to Fields.Count-1 do
                   begin
                        Fields[i].Value:=DS2.Fields[i].Value;
                   end;
                   Post;
                   DS2.Next;
              end;
         end;
         DS2.Free;
    end;
      

  15.   

    报了这个错误,在什么地方该设置呢?
    dateset not in edit or insert mode
      

  16.   

    //这个错误简单,只是说数据库不在编辑状态。
    //下面的代码满足你的要求。
    procedure DoubleAll(DBGrid:TDBGrid);
    var
         DS1,DS2:TADODataSet;
         i:Integer;
    begin
         DS1:=TADODataSet(DBGrid.DataSource.DataSet);
         DS2:=TADODataSet.Create(DBGrid.Owner);
         DS2.Clone(DS1);
         DS2.First;
         with DS1 do
         begin
              while not DS2.Eof do
              begin
                   Append;
                   for i:=0 to Fields.Count-1 do
                   begin
                        if Fields[i].FieldName='月份' then
                           Fields[i].AsString:='2004-08'
                        else
                           Fields[i].Value:=DS2.Fields[i].Value;
                   end;
                   Post;
                   DS2.Next;
              end;
         end;
         DS2.Free;
    end;
      

  17.   

    临时表,的方法比较安全,也适合这个问题.
    将查询的30条记录select into 到一个临时表中,再用DBGRID显示该表的所有内容,修改后再将临时表的内容插入到原来的表中,最后删除临时表.
      

  18.   

    还是有点问题,我的数据库中有个自动ID,这样插入的话autoid没办法插入啊
      

  19.   

    to mateng7654():
      我不会用临时表,能教我吗?
      

  20.   

    自动ID,就不用插入了,既然是自动ID会自动生成的。